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.
uint8_t I2C_WriteReg(uint8_t DevAddr,uint8_t reg_addr, uint8_t *reg_data, uint8_t count)
{
uint8_t I2Ctxbuff[8] = {0x00};
I2Ctxbuff[0] = reg_addr;
uint8_t i, j = 1;
for (i = 0; i < count; i++) {
I2Ctxbuff[j] = reg_data[i];
j++;
}
DL_I2C_fillControllerTXFIFO(I2C_INST, &I2Ctxbuff[0], count + 1);/*将数据传输到i2c总线*/
while (!(DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_IDLE));/*等待i2c空闲*/
DL_I2C_startControllerTransfer(I2C_INST, DevAddr,DL_I2C_CONTROLLER_DIRECTION_TX, count + 1);/*将数据发送给目标设备*/
while (DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);/*获取i2c总线状态*/
while (!(DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_IDLE));/*等待i2c空闲*/
DL_I2C_startControllerTransfer(I2C_INST, DevAddr,DL_I2C_CONTROLLER_DIRECTION_RX, 1);/*将数据发送给目标设备*/
DL_I2C_flushControllerTXFIFO(I2C_INST);/*清空tx缓冲区*/
return 0;
}
uint8_t I2C_ReadReg(uint8_t DevAddr,uint8_t reg_addr, uint8_t *reg_data, uint8_t count)
{
uint8_t I2Ctxbuff[8] = {0x00};
I2Ctxbuff[0] = reg_addr;
uint8_t i, j = 1;
for (i = 0; i < count; i++) {
I2Ctxbuff[j] = 0;
j++;
}
DL_I2C_fillControllerTXFIFO(I2C_INST, &I2Ctxbuff[0], count + 1);/*将数据传输到i2c总线*/
while (!(DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_IDLE));/*等待i2c空闲*/
DL_I2C_startControllerTransfer(I2C_INST, DevAddr,DL_I2C_CONTROLLER_DIRECTION_TX, count + 1);/*将数据发送给目标设备*/
while (DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);/*获取i2c总线状态*/
while (!(DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_IDLE));/*等待i2c空闲*/
DL_I2C_flushControllerTXFIFO(I2C_INST);/*清空tx缓冲区*/
DL_I2C_startControllerTransfer(I2C_INST, DevAddr, DL_I2C_CONTROLLER_DIRECTION_RX, count);/*给目标设备发送读请求*/
for (uint8_t i = 0; i < count; i++) {
while (DL_I2C_isControllerRXFIFOEmpty(I2C_INST));/*接收缓冲区为空的话*/
reg_data[i] = DL_I2C_receiveControllerData(I2C_INST);/*接收设备返回数据*/
}
return 0;
}
读写寄存器存在接收缓冲区一直为空的情况