写一段使用i2c总线从从设备(地址ADDR)的某一寄存器Addr中读取n个数据的函数void ReadBytes(uint8_t ADDR,uint8_t Addr,uint8_t DataList[n],uint8_t n);
时间: 2023-08-31 16:13:42 浏览: 82
i2c 总线读取
下面是使用I2C总线从从设备的指定寄存器中读取n个数据的函数的示例代码:
```cpp
void ReadBytes(uint8_t ADDR, uint8_t Addr, uint8_t DataList[], uint8_t n)
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, ADDR, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, Addr);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, ADDR | 0x01, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
for(uint8_t i = 0; i < n-1; i++){
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
DataList[i] = I2C_ReceiveData(I2C1);
}
I2C_AcknowledgeConfig(I2C1, DISABLE);
I2C_GenerateSTOP(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
DataList[n-1] = I2C_ReceiveData(I2C1);
}
```
这个函数的使用方法是,传入从设备的地址(ADDR)、要读取的寄存器地址(Addr)、用于存储数据的数组(DataList)以及要读取的数据个数(n)。该函数会通过I2C总线从从设备的指定寄存器中读取n个数据,并将数据存储到DataList数组中。
请注意,这段代码中没有对错误进行处理和延时机制,建议根据实际情况添加适当的错误处理和延时机制来确保数据读取的准确性和稳定性。
阅读全文