从SPI寄存器读取数据并存储到阵列中

时间:2017-04-14 12:37:56

标签: c bitwise-operators spi

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

这是SPI器件的寄存器映射。

enter image description here

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

  1. 是否设置了RRDY位? (表示RX寄存器中有数据)

  2. ROE位未设置? (表示未发生过度运行错误)

  3. 如果满足这些条件,那么我将收到的字符放入数组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]);
    }
    

1 个答案:

答案 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