嵌入式 C(SPI Bitbang 代码)左移混淆?
Embedded C (SPI Bitbang Code) Left Shift Confusion?
所以我正在为 AVR 编写一个 bitbang SPI 示例代码(这样我可以更好地理解使用 SPI 并欣赏 SPI 硬件),并且我对某些事情有点困惑。
根据我在 SPI 上读到的内容,您首先从 master 移出 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 并设置一个新的字符变量,但这是在每次迭代之后。
有多种方法可以做到这一点
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 优先的任一方向上执行此操作),或通过掩码遍历位(在任一方向都有效。
你有想出接收但不发送的屏蔽和移位吗?
所以我正在为 AVR 编写一个 bitbang SPI 示例代码(这样我可以更好地理解使用 SPI 并欣赏 SPI 硬件),并且我对某些事情有点困惑。
根据我在 SPI 上读到的内容,您首先从 master 移出 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 并设置一个新的字符变量,但这是在每次迭代之后。
有多种方法可以做到这一点
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 优先的任一方向上执行此操作),或通过掩码遍历位(在任一方向都有效。
你有想出接收但不发送的屏蔽和移位吗?