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;
}
实际上,这部分测试对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;