亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1059|回復: 9
收起左側

STM32硬件I2c

[復制鏈接]
ID:1095802 發表于 2026-3-12 21:36 | 顯示全部樓層 |閱讀模式
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. }
復制代碼


硬件邏輯分析

硬件邏輯分析

軟件邏輯分析

軟件邏輯分析
回復

使用道具 舉報

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啟動不成功吧,波形都不對,找找例程吧

就是不對啊,明明是寫的,但是波型變成讀了,一直沒找到原因所以上來問下,看看有沒人遇到這個情況
回復

使用道具 舉報

ID:1095802 發表于 2026-3-13 10:59 | 顯示全部樓層
man1234567 發表于 2026-3-13 08:32
用軟件IIC試試就知道了。

軟件模擬是能成的呀,我不是說了嗎
回復

使用道具 舉報

ID:384109 發表于 2026-3-13 11:13 | 顯示全部樓層
殿堂之上 發表于 2026-3-13 10:57
就是不對啊,明明是寫的,但是波型變成讀了,一直沒找到原因所以上來問下,看看有沒人遇到這個情況

找找例程,也找找硬件IIC如何設置,波形不止是讀的問題,是波形沒有了高電平寬度
回復

使用道具 舉報

ID:401564 發表于 2026-3-13 12:48 | 顯示全部樓層
STM32硬件IIC好像上古時期就是一直不穩定的,我在網上看到太多,也不知道是寫代碼的人有問題,還是說本身確實有問題
所以,為了省事,我一般都是直接用軟件的IIC
回復

使用道具 舉報

ID:1152952 發表于 2026-3-13 14:45 | 顯示全部樓層
假芯片,鑒定完畢
回復

使用道具 舉報

ID:647261 發表于 2026-3-13 15:47 | 顯示全部樓層
之前了解過,STM32硬件I2C有bug,但大多數情況下是能用的,只是說用著用著可能會卡死,如果你連用都沒用起來,那可能是代碼哪里不對
回復

使用道具 舉報

ID:1095802 發表于 2026-3-18 00:06 | 顯示全部樓層
sttt300 發表于 2026-3-13 15:47
之前了解過,STM32硬件I2C有bug,但大多數情況下是能用的,只是說用著用著可能會卡死,如果你連用都沒用起 ...

是有看到用的,但是不是這兩個io,下次試下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表