我正在尝试为从 MISO 线读取数据的 SPI 从设备编写代码。
这是 SPI 设备的寄存器映射。
基本上,我的代码查看status
寄存器并检查两个条件。
RRDY
位是否已设置? (说明RX寄存器中有数据)ROE
位是否未设置? (说明没有出现receive over-run错误)
如果满足这些条件,那么我将收到的字符放入数组 buf
中。
我正在向设备发送字符“A”、“B”和“C”。
当我收到“C”时,我中断循环,然后打印出“buf”的内容。
我的问题是,buf
只包含 'C'、'0'、'0'。
我的逻辑有问题吗?
char ibuf[32];
int chr;
int ptr;
while(1) { //keep checking
//if RRDY set and ROE is not 1
if (((*spi_status_reg >> 7) & 1) && (!(*spi_status_reg >> 3) & 1)) {
//macro to read char from the rx register
chr = IORD_ALTERA_AVALON_SPI_RXDATA(SPI_1_SLAVE_BASE);
ibuf[ptr] = chr; // store it
ptr ++;
//if 'C' then exit
if(chr == 'C') {
printf("Got C\r\n");
break;
}
}
}
printf("Exit\r\n");
for (int i= 0; i<3; i++) {
printf("Buffer %x\r\n", ibuf[i]);
}
最佳答案
您在 !
的第二个条件中错误地应用了 bool 非运算符 ( if
) .
而不是做!BooleanValue
你在做什么!IntegerValue
这将是True
任何时候(*spi_status_reg >> 3)
是任何非零值。
尝试!((*spi_status_reg >> 3) & 1)
相反。
(或者可能 ~(*spi_status_reg >> 3) & 1
,但这不太可读)
参见C not operator applied to int?和 http://en.cppreference.com/w/c/language/operator_precedence 。后者表明 !
比 &
具有更高的优先级 ,这就是为什么需要显式括号的原因。
仅供引用:改变1
比移位寄存器值更好,因为编译器可以优化该值(可能将其保存为常量;例如,对于 (*spi_status_reg & (1 << 7))
,编译器可能会在编译时将 (1 << 7)
替换为常量 128
)
关于c - 从 SPI 寄存器读取数据并存储到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43411670/