我正在尝试为从属设备编写代码,该设备从MISO线读取数据。
这是SPI器件的寄存器映射。
基本上我的代码查看status
寄存器并检查两个条件。
是否设置了RRDY
位? (表示RX寄存器中有数据)
ROE
位未设置? (表示未发生过度运行错误)
如果满足这些条件,那么我将收到的字符放入数组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]);
}
答案 0 :(得分:0)
您已在!
的第二个条件中错误地应用了布尔运算符(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
1}}在编译时使用常量$PATH