CC1101突发访问TX_FIFO后寄存器配置丢失问题

CC1101突发访问TX_FIFO后寄存器配置丢失
​​配置好寄存器后进行 读寄存器→写TX_FIFO 的循环 第一次读出test1中均为已配置好的数,第二次开始读出的test1为错误的且每次结果都不相同
当注释掉 halSpiWriteBurstReg(C_TXFIFO, BUF, 1); 后,每次读出test1的结果均为正确的数
请问为什么会出现这种问题?应该怎么解决呢?
代码如下:

    while(1)                                                    //读写寄存器测试通过
    {
        test = halSpiReadReg( CCxxx0_PKTCTRL1 );
        test1[0]=halSpiReadReg( CCxxx0_ADDR );
        test1[1]=halSpiReadReg( CCxxx0_PKTCTRL1 );
        test1[2]=halSpiReadReg( CCxxx0_SYNC1 );
        test1[3]=halSpiReadReg( CCxxx0_SYNC0 );
        test1[4]=halSpiReadReg( CCxxx0_MCSM0 );
            
        halSpiStrobe(CCxxx0_SIDLE);        //进入IDLE空闲状态
        halSpiStrobe(CCxxx0_SFTX);        // 清空TX_FIFO

        
        
        //halSpiWriteReg(CCxxx0_TXFIFO, BUF[0]);    //写入要发送的数据
        halSpiWriteBurstReg(CCxxx0_TXFIFO, BUF, 1);    //写入要发送的数据
        
        
        
        halSpiWriteReg(CCxxx0_IOCFG0,   0x46);
    halSpiStrobe(CCxxx0_STX);        //进入发送模式发送数据
        while (!GDO0);
        while (GDO0);
        
        i++;
    }    

//*****************************************************************************************
//函数名:void halSpiWriteBurstReg(uint16_t addr, uint16_t *buffer, uint16_t count)
//输入:地址,写入缓冲区,写入个数
//输出:无
//功能描述:SPI连续写配置寄存器
//*****************************************************************************************
void halSpiWriteBurstReg(uint16_t addr, uint16_t *buffer, uint16_t count) 
{
    uint16_t i, temp;
    temp = addr | WRITE_BURST;
    CSN_L;
    while (MISO);
    SPI1_ReadWriteByte(temp);
    for (i = 0; i < count; i++)
     {
        SPI1_ReadWriteByte(*(buffer+i));
    }
    CSN_H;
}

img

img

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/242951
  • 这篇博客你也可以参考下:<RTL设计的艺术> FIFO的正确使用与错误使用讲解
  • 这篇博客也不错, 你可以看下<RTL设计的艺术> FIFO的正确使用与错误使用讲解
  • 除此之外, 这篇博客: 可综合的异步fifo设计(二)中的 4.1.1 FIFO初始化功能验证 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    实际上,这部分测试对FIFO的读写是没有太大影响的,但一般来说,FIFO是应该具有初始化功能的,这部分功能在RTL代码中描述不方便(容易造成额外的硬件资源开销)。故将该部分功能放在tb中,所以用户根据需求在操作时可以添加初始化操作。初始化的测试波形如下图4-1.1所示。观察波形,0-1023地址都被初始化为0,知初始化功能正常。

    特别地,初始化与否并不影响FIFO的正常读写。若使用了初始化,因为这是写操作的一种特例,当写完所有地址后,会产生wr_full标志,且circle_high会取反置1,这样,后续进行用户数据的写入时,如果不做逻辑复位,则会使逻辑功能出错。故作如下处理:

    添加init_en信号,作为逻辑复位的使能信号。该信号在tb中,初始化结束后产生,并持续1个wr_clk。复位逻辑清除的波形如下图4-1.2所示。

    Tb中init_en的产生:

    @ (posedge wr_clk); //等待wr_clk上升沿
    init_en = 1; 		// init状态下的使能信号,用于wr_full和circle_high的复位
    @ (posedge wr_clk); // 持续1个clk_high
    init_en = 0;
    
    

    在这里插入图片描述

    图4-1.1 异步FIFO初始化清零仿真波形

    在这里插入图片描述

    图4-1.2 异步FIFO初始化后的逻辑复位仿真波形

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^