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

标签 c bitwise-operators spi

我正在尝试为从 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/

相关文章:

c - 通过查找表了解位设置计数的位旋转技巧

计算C中的字符数

java - boolean 运算符的差异 : & vs && and | vs ||

javascript - JavaScript 中 (|) 按位或与 (^) 按位异或的区别

c - 当我使用 N=1023 而不是 1024 时,为什么在下面的程序中会出现段错误(核心已转储)?

c - 为什么 (0 < a < 5) 这样的条件总是为真?

c - C语言如何使用Bitwise提取页码和偏移量

linux - 将多个 SPI 端口(设备)注册到单个 SPI 平台驱动程序?

beagleboneblack - 无法在 BeagleBone Green Wireless 上配置 SPI0

c - pic32在spi中只接收1个字节