STM32f103的库Hal,冗余较大,这里直接操作寄存器,实现IIC的发送功能:
void I2C_WaitEvent(uint32_t event)
{
uint16_t timeout = 200;
while(!(I2C2->SR1 & event) && --timeout);
}
void I2C2_WriteReg(uint8_t devAddr, uint8_t cmd, uint8_t *data, uint16_t len)
{
// 1. 发送起始条件
I2C2->CR1 |= I2C_CR1_START;
I2C_WaitEvent(I2C_SR1_SB); // 等待起始位确认
// 2. 发送设备地址(写模式)
I2C2->DR = devAddr; // 7位地址 + 写位(0)
I2C_WaitEvent(I2C_SR1_ADDR); // 等待地址发送完成
(void)I2C2->SR2; // 清除ADDR标志 6
// 3. 发送命令字节
I2C_WaitEvent(I2C_SR1_TXE); // 等待DR寄存器空
I2C2->DR = cmd; // 写入命令字节
// 4. 连续发送数据数组
for (uint16_t i = 0; i < len; i++)
{
I2C_WaitEvent(I2C_SR1_TXE); // 等待上一个字节发送完成
I2C2->DR = data[i];
if (I2C2->SR1 & I2C_SR1_BTF)
{
I2C2->SR1 &= ~I2C_SR1_BTF;
}
}
// 5. 发送停止条件
I2C_WaitEvent(I2C_SR1_BTF); // 确保最后字节传输完成
I2C2->CR1 |= I2C_CR1_STOP; // 产生停止信号
}
|