找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 94|回复: 7
打印 上一主题 下一主题
收起左侧

STM32硬件I2c

[复制链接]
跳转到指定楼层
楼主
STM32硬件I2c是不是有问题啊,我把AHT30温湿传感器接到PB8、PB9上,用软件模拟就是成功,但是用硬件的就出问题了,写变成读,自己摸索几天也问了豆包,但是都没解决
  1. #include "delay.h"
  2. #include "AHT30.h"
  3. int main(void)
  4. {       
  5.    uint8_t da[2] = {0xaa, 0x00};
  6.     delay_init();             // 延时初始化
  7.     AHT30_I2C_Init();    // I2C初始化
  8.      while(1)
  9.     {
  10.       I2C_WriteBytes(0x70, 0xac, da, 0);
  11.                   delay_ms(100);
  12.         }          
  13. }
  14. void AHT30_I2C_Init(void)
  15. {
  16.     GPIO_InitTypeDef GPIO_InitStructure;
  17.     I2C_InitTypeDef I2C_InitStructure;
  18.    
  19.     // 1. 使能时钟(GPIO、AFIO、I2C1)
  20.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  21.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
  22.    
  23.     // 2. I2C1引脚重映射(PB8=SCL, PB9=SDA)
  24.     GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
  25.    
  26.     // 3. 配置I2C引脚为复用开漏输出
  27.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  28.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;  // I2C必须用开漏输出
  29.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  31.    
  32.     // 4. 复位并初始化I2C1外设
  33.     I2C_DeInit(I2C1);  // 官方标准复位方式
  34.     I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  35.     I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  36.     I2C_InitStructure.I2C_OwnAddress1 = 0x00;  // 主机模式无需设置自身地址
  37.     I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  38.     I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  39.     I2C_InitStructure.I2C_ClockSpeed = 400000;  // 400KHz高速模式
  40.    
  41.     I2C_Init(I2C1, &I2C_InitStructure);
  42.     I2C_Cmd(I2C1, ENABLE);  // 使能I2C1
  43. }

  44. // 【写操作】硬件I2C写多个字节(原有代码修复)
  45. // addr:设备7位地址  reg:寄存器/命令  data:数据缓冲区  len:长度
  46. // 返回1:成功  0:失败
  47. u8 I2C_WriteBytes(u8 addr, u8 reg, u8 *data, u8 len)
  48. {
  49.     u16 timeout = 0xFFFF;
  50.    
  51.     // 等待I2C总线空闲(恢复关键步骤)
  52.     while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) && timeout--);
  53.     if(timeout == 0) return 1;

  54.     // 发送起始信号
  55.     I2C_GenerateSTART(I2C1, ENABLE);
  56.    
  57.     // 等待起始条件发送完成
  58.     timeout = 0xFFFF;
  59.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT) && timeout--);
  60.     if(timeout == 0) return 2;
  61.    
  62.     // 发送设备写地址(7位地址+写位)
  63.     I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Transmitter);
  64.    
  65.     // 等待地址发送完成并收到应答
  66.     timeout = 0xFFFF;
  67.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) && timeout--);
  68.     if(timeout == 0) return 3;
  69.    
  70.     // 发送寄存器/命令字节
  71.     I2C_SendData(I2C1, reg);
  72.     timeout = 0xFFFF;
  73.     // 修复:使用正确的发送完成事件
  74.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED) && timeout--);
  75.     if(timeout == 0) return 4;
  76.    
  77.     // 发送数据字节
  78.     for(u8 i=0; i<len; i++)
  79.     {
  80.         I2C_SendData(I2C1, data[i]);
  81.         timeout = 0xFFFF;
  82.         while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED) && timeout--);
  83.         if(timeout == 0) return 5;
  84.     }
  85.    
  86.     // 发送停止信号
  87.     I2C_GenerateSTOP(I2C1, ENABLE);
  88. return 6; // 成功
  89. }
复制代码


1.png (22.5 KB, 下载次数: 0)

硬件逻辑分析

硬件逻辑分析

2.png (37.86 KB, 下载次数: 0)

软件逻辑分析

软件逻辑分析
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:584814 发表于 2026-3-13 08:32 | 只看该作者
用软件IIC试试就知道了。
回复

使用道具 举报

板凳
ID:384109 发表于 2026-3-13 09:08 | 只看该作者
硬件IIC启动不成功吧,波形都不对,找找例程吧
回复

使用道具 举报

地板
ID:1095802 发表于 2026-3-13 10:57 | 只看该作者
人中狼 发表于 2026-3-13 09:08
硬件IIC启动不成功吧,波形都不对,找找例程吧

就是不对啊,明明是写的,但是波型变成读了,一直没找到原因所以上来问下,看看有没人遇到这个情况
回复

使用道具 举报

5#
ID:1095802 发表于 2026-3-13 10:59 | 只看该作者
man1234567 发表于 2026-3-13 08:32
用软件IIC试试就知道了。

软件模拟是能成的呀,我不是说了吗
回复

使用道具 举报

6#
ID:384109 发表于 2026-3-13 11:13 | 只看该作者
殿堂之上 发表于 2026-3-13 10:57
就是不对啊,明明是写的,但是波型变成读了,一直没找到原因所以上来问下,看看有没人遇到这个情况

找找例程,也找找硬件IIC如何设置,波形不止是读的问题,是波形没有了高电平宽度
回复

使用道具 举报

7#
ID:401564 发表于 2026-3-13 12:48 | 只看该作者
STM32硬件IIC好像上古时期就是一直不稳定的,我在网上看到太多,也不知道是写代码的人有问题,还是说本身确实有问题
所以,为了省事,我一般都是直接用软件的IIC
回复

使用道具 举报

8#
ID:1152952 发表于 2026-3-13 14:45 | 只看该作者
假芯片,鉴定完毕
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表