Что немного стучит


26

Я новичок в программировании микроконтроллеров. Я использую контроллер 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;
}


Ваш код выглядит хорошо, за исключением того, что низкий выходной сигнал тактовой частоты должен быть до установки бита и задержки. Вам нужно несколько задержек, чтобы зафиксировать время (поэтому низкие / высокие тактовые частоты примерно одинаковы) Посмотрите на код Стивена снова. Если вы хотите читать, вам нужно добавить код для этого тоже.
Оли Глейзер

@OliGlaser Могу ли я напрямую использовать этот код вместо обычного кода SPI для настройки регистров.
Верендра

@verendra - не уверен, что вы подразумеваете под «нормальным SPI-кодом». Если вы имеете в виду вместо аппаратного SPI, то АЦП не заботится о том, как генерируются импульсы, если они соответствуют протоколу и времени.
Оли Глейзер

Ответы:


25

Бит-биение создает целую серию импульсов в программном обеспечении, а не полагается на аппаратное обеспечение внутри микроконтроллера.

Многие микроконтроллеры имеют аппаратный SPI, и тогда все, что вам нужно сделать, это записать байт в выходной регистр, и контроллер SPI вытеснит данные и одновременно получит данные от ведомого устройства. Вы можете получить прерывание после завершения передачи, а затем прочитать полученные данные.

Но некоторые микроконтроллеры не имеют встроенного оборудования SPI, и тогда вам нужно смоделировать его, выполнив все вручную. SPI имеет несколько различных режимов, я буду использовать эту диаграмму импульса в качестве примера:

введите описание изображения здесь

Таким образом, в то время как выделенный SPI-контроллер заботится обо всех импульсах, смещении данных и синхронизации, при битовой синхронизации вы должны выполнять каждое действие самостоятельно:

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

SPI с бит-бэнгингом относительно прост, например, код для бита с бит-блоками I2C будет более сложным, и вам понадобится таймер, если вы хотите бить-бит по протоколу UART.


2
Можете ли вы предоставить пример кода c.
Верендра

1
@verendra - я добавил пример псевдокода, который вы легко сможете перевести на C.
stevenvh

Я успешно генерирую Wavefrom, используя SPI-связь. У меня проблема с чтением значений АЦП с использованием только SPI. Я должен использовать битовые удары для обоих или только для чтения значений АЦП. Можете ли вы взглянуть на мой код для отправки 8 бит, это написать. но я путаю, как им пользоваться. Могу ли я поместить этот код непосредственно вместо моего кода SPI в регистр настройки.
Верендра

@Steven - сначала вы видите MSB, поэтому вам нужно сдвинуть влево от 7 и сдвинуть влево от 0. Я знаю, что стандарта нет, поэтому сначала он может быть LSB, но я думаю, что большинство периферийных устройств SPI делают это таким образом ,
Оли Глейзер

2
@ Оли - хорошо, я пропустил это. Я исправлю, спасибо за отзыв. Причина отсутствия стандарта в том, что это не имеет значения, если количество передаваемых битов равно длине регистра сдвига. В последнее время некоторые микроконтроллеры (например, NXP Cortec-M3) имеют регистр сдвига переменной длины, и тогда может иметь значение направление. Во IIRC в AVR вы можете сначала выбрать MSB или LSB.
Стивенвх

6

Бит-бэнгинг относится к концепции того, чтобы сигналы, которые выходят из устройства или поступают в него, генерировались / отбирались программным, а не аппаратным обеспечением. Очевидно, что требуется какое-то оборудование, но при использовании битового разброса единственным оборудованием для каждого выхода является защелка, которая может быть явно установлена ​​или очищена программным обеспечением, а единственным оборудованием для каждого входа является интерфейс, позволяющий программному обеспечению проверить, является ли оно высокий или низкий (и обычно выполняют условную ветвь для одного состояния, но не для другого).

Максимальная скорость, которая может быть достигнута с помощью битовой синхронизации, обычно составляет часть от той, которая может быть достигнута с помощью специализированного аппаратного обеспечения, но вне ограничений, налагаемых скоростью процессора, битовая комбинация является гораздо более универсальной и может использоваться в обстоятельствах где оборудование общего назначения не совсем подходит, а оборудование специального назначения не будет экономически эффективным.

Например, многие контроллеры имеют порт «SPI-style», который ведет себя по существу следующим образом: когда байт записывается в определенный регистр, аппаратное обеспечение будет генерировать некоторое количество тактовых импульсов (обычно восемь), синхронизируя бит данных на передний фронт каждого тактового импульса и выборка входного бита данных на заднем фронте. Обычно порты в стиле SPI контроллеров позволяют настраивать различные функции, но в некоторых случаях может потребоваться сопряжение процессора с устройством, которое выполняет что-то необычное. Устройство может требовать, чтобы биты данных были обработаны с кратными, отличными от восьми, или оно может требовать, чтобы данные выводились и отбирались на одном и том же фронте тактового сигнала, или оно может иметь некоторые другие необычные требования. Если конкретное оборудование на используемом контроллере может поддерживать точные требования, отлично (некоторые предоставляют настраиваемое количество битов, отдельно конфигурируемую синхронизацию передачи и приема и т. д.) Если нет, может быть полезна разбивка битов. В зависимости от контроллера, синхронизация битов интерфейса SPI-ish часто занимает в 2-10 раз больше времени, чем позволяет аппаратному обеспечению обрабатывать его, но если требования не соответствуют аппаратному обеспечению, обмен данными медленнее может быть лучше, чем не будучи в состоянии сделать это вообще.

Одна важная вещь, которую следует отметить при проектировании с побитовым битом, - это то, что они являются простейшими и наиболее надежными в обстоятельствах, когда либо устройства, с которыми осуществляется связь, ожидают на контроллере побитового битования, чтобы сгенерировать все свои временные характеристики, либо когда контроллеру будет разрешено ждите, не отвлекаясь, событие, чтобы прибыть, и где он сможет сделать все, что нужно сделать с этим событием, прежде чем наступит любое другое событие, на которое он должен действовать. Они гораздо менее устойчивы в условиях, когда устройство должно быть способно реагировать на внешние раздражители в течение относительно короткого периода времени, но не может направить 100% своей энергии на отслеживание таких раздражителей.

Например, предположим, что требуется, чтобы процессор передавал данные в стиле UART последовательно со скоростью, которая очень высока относительно его тактовой частоты (например, PIC, который выполняет 8192 команды в секунду, желает выводить данные со скоростью 1200 бит / с). Если никакие прерывания не разрешены, такая передача не является трудной (синхронизируйте один бит каждые семь циклов команд). Если PIC ничего не делает, кроме ожидания входящего байта данных со скоростью 1200 бит / с, он может выполнить 3-тактный цикл, ожидающий стартовый бит, а затем перейти к синхронизации данных с семичастными интервалами. Действительно, если бы у PIC был байт данных, готовый к отправке, когда поступил входящий байт данных, для PIC было бы достаточно времени, чтобы PIC отправил свой байт данных одновременно с чтением входящего байта. Точно так же,если такой ответ будет иметь фиксированное время относительно первоначальной передачи . С другой стороны, для PIC не было бы возможности обрабатывать обмен данными по битам таким образом, чтобы любому устройству было разрешено передавать в любое удобное время (в отличие от наличия одного устройства, которое могло бы передавать, когда оно видит). подходит и делает все, что угодно, когда не передает, и одно устройство, которое должно было бы тратить большую часть своего времени, ничего не делая, кроме ожидания передачи с первого устройства).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.