gpt4 book ai didi

c - 从 SPI 寄存器读取数据并存储到数组中

转载 作者:行者123 更新时间:2023-11-30 16:47:12 28 4
gpt4 key购买 nike

我正在尝试为从 MISO 线读取数据的 SPI 从设备编写代码。

这是 SPI 设备的寄存器映射。

enter image description here

基本上,我的代码查看status寄存器并检查两个条件。

  1. RRDY 位是否已设置? (说明RX寄存器中有数据)

  2. 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com