DW1000接收流程:初始化与配置与上一篇的初始化配置相同接下来写不相同的地方---->DW1000接收使能---->读取DW1000状态寄存器是否接收完成或者接收错误---->读取数据长度---->将数据写入buf中---->写1清除接收完成位。
主函数代码如下:
int main(void)
{
int i;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
DW1000_IRQ_Init();
DW1000_SPI_Init();
if(DW1000_Wakeup() != DWT_SUCCESS)
while(1);
USART1_Init(115200);//将波特率设置为115200
reset_DW1000();
spi_set_rate_low();
if (dwt_initialise(DWT_LOADNONE) == DWT_ERROR)
USART1_SendStr("DW1000 INIT FAILED\r\n");
spi_set_rate_high();
dwt_configure(&config);//同上一篇
while(1)
{
for(i=0;i<FRAME_LEN_MAX;i++)//帧最大长度为127
rx_buffer[i]=0;
dwt_rxenable(DWT_START_RX_IMMEDIATE);//立即开始接收
while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)));//判断是否接收成功或者是接收错误
if(status_reg & SYS_STATUS_RXFCG)
{
frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;
if (frame_len <= FRAME_LEN_MAX)
{
dwt_readrxdata(rx_buffer, frame_len, 0);//将数据读到buf中
}
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);//写1清除
}
else
{
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);//错误也写1清除
}
for(i=0;i<frame_len;i++)//打印数据
USART1_SendChar(rx_buffer[i]);
USART1_SendStr("\r\n");
}
}
这样写,CPU会一直处于接收DW1000数据的状态,占用CPU,下篇写使用中断处理,当有接收到数据时,DW1000会产生中断,然后根据接收数据不同的结果进入不同的函数(成功、错误、超时),中断具体实现写在下一篇。