This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2530读取SPI Flash数据错位问题

Other Parts Discussed in Thread: CC2530

      cc2530 终端上面外接了一块SPI Flash. 在裸机(不跑协议栈的时候)上面测试Flash的时候,一切读写正常; 如果终端没有加入协调器的时候,测试SPI Flash的读写也是一切正常;

      当终端加入协调器后,从0地址读取Flash的时候,读出来的数据就错位了(比如,第一个字节的数据变成了第二个字节的数据,第二个字节的数据变成了第三个字节的数据)。这时当协调器断电以后(终端断开连接),读出来的数据依旧错位。

  

  • 问题终于解决了。在读取单个字节的时候,发送完0xFF(Command)以后,等待发送完成的方法有问题,以前是这样的读取一个字节的:

    uint8 SPI_ReadWriteByte( uint8 Command )
    {
       uint8 Rxdata;
       U1DBUF = Command;
       while( 0 == ( U1CSR & ( 1 << 1 ) ) ); //直到发送完成
       U1CSR &= ~( 1 << 1 ); //clear flag  
        Rxdata = U1DBUF;
        return Rxdata;
    }

    采取这种方式会导致连网以后,在最后一个时钟周期,没有片选信号。采用以下方式即可解决:

    uint8 SPI_ReadWriteByte( uint8 Command )
    {
       uint8 Rxdata;
       U1DBUF = Command;
      // while( 0 == ( U1CSR & ( 1 << 1 ) ) ); //直到发送完成
       while (U1ACTIVE);
       U1CSR &= ~( 1 << 1 ); //clear flag
       Rxdata = U1DBUF;
       return Rxdata;
    }

  • 您好:

    我也遇到了类似的读取数据错误问题;

    这里提到的寄存器ACTIVE位Datasheet的解释是:USART transmit/receive active status. In SPI slave mode, this bit equals slave select.

    这里使用master mode ,还是应该判断TX_BYTE,也就是while( 0 == ( U1CSR & ( 1 << 1 ) ) );