嵌入式C(SPI Bitbang代码)左移混淆?

时间:2018-11-30 04:45:18

标签: embedded avr spi

因此,我为AVR编写了一个bangbang SPI示例代码(因此,我可以更好地理解SPI并欣赏SPI硬件),并且在某些方面有些困惑。

根据我在SPI上所读的内容,您首先将LSB从主设备移出了...。但是我不确定该怎么做?我的意思是本质上我想关闭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?
    }
}

我要把它右移吗?然后我将读取MISO行并检查1或0并设置一个新的字符变量,但这是在每次迭代之后。

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点

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的任一方向进行操作),或者将这些位遍历各个掩码(沿任一方向的操作。

您确定要接收但不发送的掩蔽和转移吗?