Я новичок в программировании микроконтроллеров. Я использую контроллер ATmega32-A и компилятор CodeVisionAVR. Я использую генератор сигналов (AD9833) для генерации синусоидального сигнала с использованием связи SPI. Я могу успешно генерировать синусоидальную волну. Теперь я передаю этот сигнал на датчик. Выход датчика выбирается через мультиплексор и отправляется на АЦП. Теперь я хочу прочитать значения АЦП с использованием связи SPI. Я много пытался настроить регистры АЦП. Тем не менее это не работает. Чтобы увидеть код связи SPI, взгляните на мой предыдущий пост Настройка регистров ADC с использованием связи Spi . Я использую связь USART (RS232) для печати значений на ПК (PuTTY).
Кто-то посоветовал мне использовать бит-удары. Я новичок в этой концепции. Может ли кто-нибудь предоставить мне пример кода битов связи SPI. Как начать эту процедуру? Может ли кто-нибудь предоставить мне хорошую технику. Нужно ли какое-либо внешнее оборудование?
Я написал это, в том числе контакты:
#define ADC_CS PORTB.3
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7
void send_8bit_serial_data(unsigned char data)
{
int i;
ADC_CS=0;
for (i = 0; i < 8; i++)
{
// consider leftmost bit
// set line high if bit is 1, low if bit is 0
if (data & 0x80)
output_high(PORTB.5);
else
output_low(PORTB.5);
// pulse clock to indicate that bit value should be read
output_low(PORTB.7);
output_high(PORTB.7);
// shift byte left so next bit will be leftmost
data <<= 1;
}
// deselect device
ADC_CS=1;
}
источник
Ответы:
Бит-биение создает целую серию импульсов в программном обеспечении, а не полагается на аппаратное обеспечение внутри микроконтроллера.
Многие микроконтроллеры имеют аппаратный SPI, и тогда все, что вам нужно сделать, это записать байт в выходной регистр, и контроллер SPI вытеснит данные и одновременно получит данные от ведомого устройства. Вы можете получить прерывание после завершения передачи, а затем прочитать полученные данные.
Но некоторые микроконтроллеры не имеют встроенного оборудования SPI, и тогда вам нужно смоделировать его, выполнив все вручную. SPI имеет несколько различных режимов, я буду использовать эту диаграмму импульса в качестве примера:
Таким образом, в то время как выделенный SPI-контроллер заботится обо всех импульсах, смещении данных и синхронизации, при битовой синхронизации вы должны выполнять каждое действие самостоятельно:
SPI с бит-бэнгингом относительно прост, например, код для бита с бит-блоками I2C будет более сложным, и вам понадобится таймер, если вы хотите бить-бит по протоколу UART.
источник
Бит-бэнгинг относится к концепции того, чтобы сигналы, которые выходят из устройства или поступают в него, генерировались / отбирались программным, а не аппаратным обеспечением. Очевидно, что требуется какое-то оборудование, но при использовании битового разброса единственным оборудованием для каждого выхода является защелка, которая может быть явно установлена или очищена программным обеспечением, а единственным оборудованием для каждого входа является интерфейс, позволяющий программному обеспечению проверить, является ли оно высокий или низкий (и обычно выполняют условную ветвь для одного состояния, но не для другого).
Максимальная скорость, которая может быть достигнута с помощью битовой синхронизации, обычно составляет часть от той, которая может быть достигнута с помощью специализированного аппаратного обеспечения, но вне ограничений, налагаемых скоростью процессора, битовая комбинация является гораздо более универсальной и может использоваться в обстоятельствах где оборудование общего назначения не совсем подходит, а оборудование специального назначения не будет экономически эффективным.
Например, многие контроллеры имеют порт «SPI-style», который ведет себя по существу следующим образом: когда байт записывается в определенный регистр, аппаратное обеспечение будет генерировать некоторое количество тактовых импульсов (обычно восемь), синхронизируя бит данных на передний фронт каждого тактового импульса и выборка входного бита данных на заднем фронте. Обычно порты в стиле SPI контроллеров позволяют настраивать различные функции, но в некоторых случаях может потребоваться сопряжение процессора с устройством, которое выполняет что-то необычное. Устройство может требовать, чтобы биты данных были обработаны с кратными, отличными от восьми, или оно может требовать, чтобы данные выводились и отбирались на одном и том же фронте тактового сигнала, или оно может иметь некоторые другие необычные требования. Если конкретное оборудование на используемом контроллере может поддерживать точные требования, отлично (некоторые предоставляют настраиваемое количество битов, отдельно конфигурируемую синхронизацию передачи и приема и т. д.) Если нет, может быть полезна разбивка битов. В зависимости от контроллера, синхронизация битов интерфейса SPI-ish часто занимает в 2-10 раз больше времени, чем позволяет аппаратному обеспечению обрабатывать его, но если требования не соответствуют аппаратному обеспечению, обмен данными медленнее может быть лучше, чем не будучи в состоянии сделать это вообще.
Одна важная вещь, которую следует отметить при проектировании с побитовым битом, - это то, что они являются простейшими и наиболее надежными в обстоятельствах, когда либо устройства, с которыми осуществляется связь, ожидают на контроллере побитового битования, чтобы сгенерировать все свои временные характеристики, либо когда контроллеру будет разрешено ждите, не отвлекаясь, событие, чтобы прибыть, и где он сможет сделать все, что нужно сделать с этим событием, прежде чем наступит любое другое событие, на которое он должен действовать. Они гораздо менее устойчивы в условиях, когда устройство должно быть способно реагировать на внешние раздражители в течение относительно короткого периода времени, но не может направить 100% своей энергии на отслеживание таких раздражителей.
Например, предположим, что требуется, чтобы процессор передавал данные в стиле UART последовательно со скоростью, которая очень высока относительно его тактовой частоты (например, PIC, который выполняет 8192 команды в секунду, желает выводить данные со скоростью 1200 бит / с). Если никакие прерывания не разрешены, такая передача не является трудной (синхронизируйте один бит каждые семь циклов команд). Если PIC ничего не делает, кроме ожидания входящего байта данных со скоростью 1200 бит / с, он может выполнить 3-тактный цикл, ожидающий стартовый бит, а затем перейти к синхронизации данных с семичастными интервалами. Действительно, если бы у PIC был байт данных, готовый к отправке, когда поступил входящий байт данных, для PIC было бы достаточно времени, чтобы PIC отправил свой байт данных одновременно с чтением входящего байта. Точно так же,если такой ответ будет иметь фиксированное время относительно первоначальной передачи . С другой стороны, для PIC не было бы возможности обрабатывать обмен данными по битам таким образом, чтобы любому устройству было разрешено передавать в любое удобное время (в отличие от наличия одного устройства, которое могло бы передавать, когда оно видит). подходит и делает все, что угодно, когда не передает, и одно устройство, которое должно было бы тратить большую часть своего времени, ничего не делая, кроме ожидания передачи с первого устройства).
источник