Embedded 嵌入式C(SPI比特邦码)左移位混淆?

Embedded 嵌入式C(SPI比特邦码)左移位混淆?,embedded,avr,spi,Embedded,Avr,Spi,因此,我正在为AVR编写一个bitbang SPI示例代码(这样我可以更好地理解如何使用SPI并欣赏SPI硬件),我对一些事情感到有点困惑 从我在SPI上读到的,你首先从master上移出LSB…但我不知道怎么做?我的意思是,本质上我想弹出LSB,并将新的8位二进制值设置为before,但LSB弹出 (我在循环中执行此操作,获取一个无符号字符,然后希望在每个循环中发送LSB) 这就是我到目前为止所做的: 无符号字符传输字节(无符号字符数据字节) { int i; 字符检索数据; 启用_SPI()

因此,我正在为AVR编写一个bitbang SPI示例代码(这样我可以更好地理解如何使用SPI并欣赏SPI硬件),我对一些事情感到有点困惑

从我在SPI上读到的,你首先从master上移出LSB…但我不知道怎么做?我的意思是,本质上我想弹出LSB,并将新的8位二进制值设置为before,但LSB弹出

(我在循环中执行此操作,获取一个无符号字符,然后希望在每个循环中发送LSB)

这就是我到目前为止所做的:

无符号字符传输字节(无符号字符数据字节)
{
int i;
字符检索数据;
启用_SPI();/*设置正确的数据方向端口*/
_延迟μms(100);
ss_low();/*设置ss low*/
_延迟μms(100);
/*SCLK目前处于低位,MOSI处于低位,SS处于低位*/

对于(i=0;i有很多方法可以做到这一点

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
   }
}
无符号字符掩码;
...

对于(mask=0x01,i=0;i您的返回语句在哪里?如果这是主代码,为什么要读取端口?主代码负责同时生成MOSI和时钟-它们必须位于同一端口上,因此您可以同时向它们写入。当然,根据时钟相位,SPI允许在该相位中稍后发送数据,并且允许不同的时钟极性。您必须意识到的另一件事是SPI是全双工的。您在发送的同时接收-它实际上只是一个连接到一个rx数据寄存器和一个tx数据寄存器的美化移位寄存器。因此,如果您想对SPI进行位转换,您必须很快读取MISO(~100ns)设置MOSI之后。
x>>=1;
是如何“弹出LSB并将新的8位二进制值设置为before,但LSB弹出时”。所有剩余位向右移动一个点,最左边的点变为0。首先,将其向后移动。SPI传统上是MSB优先,而异步UART传统上是LSB优先。
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
   }
}