RS6240进行微动点云数据上报

ramez666 2026-04-23 15:04:03

修改后可得到看似正确的帧头

我想问的是: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;
}
 

...全文
143 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nayo212 04-23 17:38
  • 打赏
  • 举报
回复

3.是否有方法判断每一次的第一帧中的payload数据是否正确(长度及数据内容):
数据结构是6字节消息头(header)+N字节payload+4字节checksum32,可以计算checksum32确定是否正确,计算方式如下:
((uint32_t *)&header[2]) + calc_checksum32(payload) == ~checksum32
如果相等,说明数据正确

nayo212 04-23 17:34
  • 打赏
  • 举报
回复

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

RuifDu 04-23 17:07
  • 打赏
  • 举报
回复

1.请问msgID位的0xC6是什么含义,我在手册中看到C1,C3分别为上报FFT,点云数据:
0xC6对应了调试协议,这个协议在《RS6x_7x_毫米波雷达开发_快速入门》中"6 雷达调试方法"有说明;
其他两个问题我们再看看。

171

社区成员

发帖
与我相关
我的任务
社区描述
欢迎来到正和微芯官方社区,这里是毫米波雷达技术爱好者、开发者、技术专家以及行业领袖的聚集地。我们致力于提供一个开放、合作、创新的交流平台,让每一位成员都能在这里找到价值、获得启发、实现成长。
硬件架构射频工程物联网 企业社区 广东省·珠海市
社区管理员
  • Possumic正和微芯官方
  • sblxk008
  • 波谱Sense
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧