Встроенный C (код SPI Bitbang) Путаница влево? - PullRequest
0 голосов
/ 30 ноября 2018

Итак, я пишу пример кода SPI для BitRang для AVR (так что я лучше понимаю, как использовать SPI и ценю аппаратное обеспечение SPI), и я немного запутался в некоторых вещах.

Из того, что я прочитал на SPI, вы сначала вытесняете LSB из master .... но я не уверен, как это сделать?По сути, я хочу отключить LSB и установить новое 8-битное двоичное значение на предыдущее, но с отключенным LSB

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

Это то, что у меня есть до сих пор:

unsigned char transmit_byte(unsigned char data_byte) 
{
    int i;
    char ret_data;

    enable_SPI();       /* Set up correct Data Direction Ports */
    _delay_ms(100);
    ss_low();           /* Set SS Low */
    _delay_ms(100);

    /* SCLK Currently holding low, MOSI is low, SS is low */
    for (i = 0; i <= 7; i++) 
    {
        if (0x80 & SPI_PORT)
        {
            mosi_high();
        }
        else 
        {
            mosi_low();
        }
        /* MOSI Value is latched in */
        _delay_ms(10); // Probably unnecessary

        //something here?
    }
}

Буду ли я просто сдвигать его?0 и установите новую символьную переменную, но это после каждой итерации.

1 Ответ

0 голосов
/ 30 ноября 2018

Есть несколько способов сделать это

unsigned char mask;
...
for (mask = 0x01, i = 0; i <= 7; i++, mask<<=1) 
{
   ...
   if(data_out&mask)
   {
       set mosi to 1
   }
   else
   {
       set mosi to 0
   }
}

или

unsigned char data_temp;
...
data_temp = data_out;
for(i = 0; i <= 7 ; i++)
{
   ...
   if(data_temp&1)
   {
      set mosi to 1
   }
   else
   {
      set mosi to 0
   }
}

- это два основных стиля.

пройти маску через биты (Вы можете сделать это в любом направлении сначала lsb или сначала msb), или пройти биты через маску (работает в любом направлении.

Вы вычислили маскировку и сдвиг для приема, но не для отправки?

...