I2C协议 读数据的时候为啥要发送几次地址 (Dummy Write 哑写)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是基本的步骤: 1. 配置I2C外设:设置I2C的时钟频率、I2C地址等参数。 2. 配置GPIO口:将SDA和SCL引脚配置为I2C模式。 3. 接收主机的读写请求:在I2C的中断服务函数中,检查接收到的I2C事件,例如接收到了地址匹配事件或接收到了数据。 4. 处理主机的读写请求:如果接收到了读取请求,则向主机发送数据;如果接收到了写入请求,则接收主机发送的数据。 这里给出一个简单的示例代码: ```c #include "stm32f10x.h" #define SLAVE_ADDRESS 0x50 uint8_t data = 0x55; void I2C1_EV_IRQHandler(void) { // 检查I2C事件 if (I2C1->SR1 & I2C_SR1_ADDR) { // 接收到地址匹配事件 uint8_t dummy = I2C1->SR2; } if (I2C1->SR1 & I2C_SR1_RXNE) { // 接收到数据 uint8_t received = I2C1->DR; } if (I2C1->SR1 & I2C_SR1_TXE) { // 发送数据 I2C1->DR = data; } } int main(void) { // 配置I2C1外设 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); I2C_InitTypeDef i2c; i2c.I2C_ClockSpeed = 100000; i2c.I2C_Mode = I2C_Mode_I2C; i2c.I2C_DutyCycle = I2C_DutyCycle_2; i2c.I2C_OwnAddress1 = SLAVE_ADDRESS; i2c.I2C_Ack = I2C_Ack_Enable; i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1, &i2c); I2C_Cmd(I2C1, ENABLE); // 配置GPIO口 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef gpio; gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; gpio.GPIO_Mode = GPIO_Mode_AF_OD; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio); // 配置I2C中断 NVIC_InitTypeDef nvic; nvic.NVIC_IRQChannel = I2C1_EV_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 0; nvic.NVIC_IRQChannelSubPriority = 0; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); I2C_ITConfig(I2C1, I2C_IT_EVT, ENABLE); while (1); } ``` 这个示例代码是一个最基本的I2C从机发送数据的例子,你可以根据自己的需求修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值