大家好、
我的 SSI 通信有问题、我需要获得指导以更好地理解或处理代码生成的异常。
-我有一个带有 tm4c1294ncpdt Tiva C 处理器的定制板
-我有4个数字传感器( icm20602 ),我从这些传感器读取这些传感器,并通过 USB-c 连接到定制板
-这些传感器可以在运行时移除、当移除传感器时、数据收集停止、并在 Tiva 上触发软件复位、以从头开始。
有时、该 序列不会发生、它进入一个循环、然后在10s 后执行复位、一切都正常
我怀疑在 我从传感器中簧入数据的确切时间移除传感器时、传感器会进入延迟环路
代码、 用于将传感器数据红色化为缓冲器、然后交换 ACC 和陀螺仪的字节
uint8_t read_icm20602_sensor(uint8_t sensor_id, uint8_t timeout, uint8_t *buffer) {
uint8_t drdy_data;
uint8_t whoamy_data;
uint8_t icm_buff[14];
select_digi_sensor(sensor_id);
// SSI1_device_read(WHO_AM_I, 1, &whoamy_data);
// if(whoamy_data != WHO_AM_I_DATA_OK) return 0;
uint16_t buffer_index = ICM20602_DATA_SIZE * (sensor_id -1);
while(timeout--){
SSI1_device_read(INT_STATUS, 1, &drdy_data);
if ((drdy_data & 0x01) == 0x01){
SSI1_device_read(ACCEL_XOUT_H, 14, icm_buff);
icm20602_buffer_byte_swap(&buffer[buffer_index], icm_buff);
return 1;
}
}
return 0;
}
执行 SSI 读取和发送的函数
unsigned char SSI1_transmit_data(unsigned char data) {
uint32_t rx_buffer;
while(SSIDataGetNonBlocking(SSI1_BASE, &rx_buffer));
SSIDataPut(SSI1_BASE, data);
while(SSIBusy(SSI1_BASE));
SSIDataGet(SSI1_BASE, &rx_buffer);
// while(SSIBusy(SSI1_BASE));// added for testing purpose, this waits till the buffer is full.
return rx_buffer & 0x00FF;
}
void SSI1_device_read(uint8_t address, uint8_t size, uint8_t *buffer) {
uint32_t i = 0;
SSI1_cs_on();
address |= 0x80;
SSI1_transmit_data(address);
for(i = 0; i < size; i++){
buffer[i] = SSI1_transmit_data(0xFF);
}
SSI1_cs_off();
}
我是否监督代码中的内容或这些功能的处理