171
社区成员
发帖
与我相关
我的任务
分享
修改后可得到看似正确的帧头
我想问的是:1.请问msgID位的0xC6是什么含义,我在手册中看到C1,C3分别为上报FFT,点云数据
2.第二个帧得到的为complete ack数据时,为何第一帧的more指示位也为1
3.是否有方法判断每一次的第一帧中的payload数据是否正确(长度及数据内容)
下为我使用的上位机接收代码:
int get_one_chirp(uint8_t *recv_buf, int max_len)
{
uint8_t poll_cmd[14] = {
0xA5, 0x35, 0x15, 0x0C, 0x04, 0x00, 0x02, 0x00,
0x2D, 0x00, 0xE8, 0xF3, 0xCE, 0xFF
};
uint8_t header[6];
uint16_t payload_len = 0;
uint8_t more_flag = 0;
uint32_t checksum = 0;
int n = 0;
int i, j;
int total_offset = 0;
uint8_t continue_read = 1; // 是否继续读取的标志
// 发送 POLL 指令
GPIO_ResetBits(RADAR_CS_PORT, RADAR_CS_PIN); //拉低片选信号
for(i = 0; i < 14; i++) {
SPI2_ReadWriteByte(poll_cmd[i]);
}
GPIO_SetBits(RADAR_CS_PORT, RADAR_CS_PIN); //拉高片选信号
delay_ms(2);
// ===== 动态循环:根据实际情况读取 =====
i = 0;
while(continue_read && i < 10) {
// 读取 Header
GPIO_ResetBits(RADAR_CS_PORT, RADAR_CS_PIN); //拉低片选信号
for(j = 0; j < 6; j++) {
header[j] = SPI2_ReadWriteByte(0xFF);
}
printf("[包 %d] Header: %02X %02X %02X %02X %02X %02X\r\n",
i, header[0], header[1], header[2],
header[3], header[4], header[5]);
if(header[0] != 0xA5) {
printf(" Magic错误,跳过\r\n");
GPIO_SetBits(RADAR_CS_PORT, RADAR_CS_PIN); //拉高片选信号
i++;
continue;
}
payload_len = ((header[5] & 0x0F) << 8) | header[4]+5;
more_flag = (header[2] >> 5) & 0x01;
printf(" Payload: %d, More: %d\r\n", payload_len, more_flag);
delay_us(200);
// 读取数据
for(j = 0; j < payload_len; j++) {
recv_buf[total_offset + j] = SPI2_ReadWriteByte(0xFF);
}
GPIO_SetBits(RADAR_CS_PORT, RADAR_CS_PIN); //拉高片选信号
n++;
total_offset += payload_len;
// ===== 根据more_flag决定是否继续 =====
if(more_flag == 0) {
// 没有更多数据了
delay_us(50);
// 再次检查Notify,防止遗漏
if(GPIO_ReadInputDataBit(RADAR_NOTIFY_PORT, RADAR_NOTIFY_PIN) == SET) {
printf(" more=0但Notify仍为高,更新POLL继续\r\n");
// 更新POLL命令...
poll_cmd[8] = 45 - i - 1;
checksum = calc_check32(&poll_cmd[2], 8);
poll_cmd[10] = (checksum >> 24) & 0xFF;
poll_cmd[11] = (checksum >> 16) & 0xFF;
poll_cmd[12] = (checksum >> 8) & 0xFF;
poll_cmd[13] = checksum & 0xFF;
GPIO_ResetBits(RADAR_CS_PORT, RADAR_CS_PIN); //拉低片选信号
for(j = 0; j < 14; j++) {
SPI2_ReadWriteByte(poll_cmd[j]);
}
GPIO_SetBits(RADAR_CS_PORT, RADAR_CS_PIN); //拉高片选信号
delay_ms(2);
// 继续循环
} else {
printf(" more=0,正常结束\r\n");
continue_read = 0; // 停止循环
}
}
// more_flag == 1 时继续循环
i++;
}
printf("本次读取完成,共 %d 个包\r\n", n);
return n;
}
3.是否有方法判断每一次的第一帧中的payload数据是否正确(长度及数据内容):
数据结构是6字节消息头(header)+N字节payload+4字节checksum32,可以计算checksum32确定是否正确,计算方式如下:
((uint32_t *)&header[2]) + calc_checksum32(payload) == ~checksum32
如果相等,说明数据正确
2.第二个帧得到的为complete ack数据时,为何第一帧的more指示位也为1:
日志说明每次雷达都是上传一包有效数据,但是主机发送POLL指令时请求的数据包数目大于1,因此雷达会在这个有效数据包后面添加一个NULL TAIL,也就是图中的“包 1”,而SPI传输数据时,数据包的more字段是根据这一包数据后面是否还有数据包来设置的,如果有,就是1,如果没有,就是0,所以“包 0”,即第一帧的more指示位为1
另外说明一下,payload长度计算公式是payload_len = header[4] + (header[5] & 0xF) * 256
1.请问msgID位的0xC6是什么含义,我在手册中看到C1,C3分别为上报FFT,点云数据:
0xC6对应了调试协议,这个协议在《RS6x_7x_毫米波雷达开发_快速入门》中"6 雷达调试方法"有说明;
其他两个问题我们再看看。