This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
void I2C_READ(){
/*等待 I2C 进入空闲状态*/
while (!(
DL_I2C_getControllerStatus (I2C_INST)和 DL_I2C_CONTROL_STATUS_IDLE)
;
/*增加传输之间的延迟*/
delay_cycles (1000);
/*发送读取请求至目标方*/
DL_I2C_startControllerTransfer (I2C_INST、I2C_TARGET_ADDRESS、
DL_I2C_CONTROLLER_DIRECTION_RX、I2C_RX_packet_SIZE);
/*
*接收来自目标的所有字节。 如果不是所有字节、LED 将保持高电平
*已收到
*/
for (uint8_t i = 0;I < I2C_RX_packet_size;I++){
while (DL_I2C_isControllerRXFIFOEMty (I2C_INST))
;
gRxPacket[i]= DL_I2C_receiveControllerData (I2C_INST);
}
}
TX 封装为3个字节、RX 封装为4个字节。
TX (I2C 从器件地址、寄存器地址、要写入寄存器的数据)
Rx 软件包(起始位 I2C 从器件地址 ACK、寄存器地址 ACK、起始位从器件地址 Ack、ReadData ACK 停止位。
上面是读取数据的帧。
void I2C_READ (uint8_t reg_address){
/*增加传输之间的延迟*/
delay_cycles (1000);
DL_I2C_startControllerTransfer (I2C_INST、I2C_TARGET_ADDRESS、
DL_I2C_CONTROL_DIRECTION_TX、reg_ADDRESS);
/*发送读取请求至目标方*/
DL_I2C_startControllerTransfer (I2C_INST、I2C_TARGET_ADDRESS、
DL_I2C_CONTROLLER_DIRECTION_RX、I2C_RX_packet_SIZE);
/*
*接收来自目标的所有字节。 如果不是所有字节、LED 将保持高电平
*已收到
*/
for (uint8_t i = 0;I < I2C_RX_packet_size;I++){
while (DL_I2C_isControllerRXFIFOEMty (I2C_INST))
;
gRxPacket[i]= DL_I2C_receiveControllerData (I2C_INST);
}
}
以下是更新的 void I2C_read (uint8_t reg_address)函数。
程序卡在 时间内(DL_I2C_isControllerRXFIFOEMty (I2C_INST))
;
数量。 请推荐解决方案。
您好、Vaishak、
for (uint8_t i = 0;I < I2C_RX_packet_size;I++){
while (DL_I2C_isControllerRXFIFOEMty (I2C_INST))
;
gRxPacket[i]= DL_I2C_receiveControllerData (I2C_INST);}
[/报价]逻辑看起来异常。 我更喜欢贝洛斯:
for (uint8_t i = 0;I < I2C_RX_packet_size;I++){
如果 (! DL_I2C_isControllerRXFIFOEMty (I2C_INST){
gRxPacket[i]= DL_I2C_receiveControllerData (I2C_INST);
}
否则{
中断;
}
}
B.R.
萨尔
谢谢 Sal Ye、查询已解决。