STM32/STM8技术论坛
直播中

马大红

未满1年用户 3经验值
擅长:嵌入式技术 控制/MCU
私信 关注
[经验]

STM32f103,直接操作寄存器,实现IIC的发送

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)      // 检测字节传输完成 [10]()
{  
    I2C2->SR1 &= ~I2C_SR1_BTF;    // 清除标志 
}

}
// 5. 发送停止条件
I2C_WaitEvent(I2C_SR1_BTF); // 确保最后字节传输完成

I2C2->CR1 |= I2C_CR1_STOP; // 产生停止信号

}

更多回帖

发帖
×
20
完善资料,
赚取积分