1 #ifndef _IIC_H
2 #define _IIC_H
3
4 #include 'stdio.h'
5 #include 'stm32f1xx_hal.h'
6
7
8 /* 定義控制 SDA SCL 的宏 標準庫版
9 #define I2C_SDA_UP GPIO_SetBits (GPIOC,GPIO_PIN_8) //SDA高電平
10 #define I2C_SDA_LOW GPIO_ResetBits(GPIOC,GPIO_PIN_8) //SDA低電平
11 #define I2C_SCL_UP GPIO_SetBits (GPIOC,GPIO_PIN_9) //SCL高電平
12 #define I2C_SCL_LOW GPIO_ResetBits(GPIOC,GPIO_PIN_9) //SCL低電平
13 */
14
15
16 /* 定義控制 SDA SCL 的宏 HAL庫版 */
17
18 #define I2C_SDA_UP HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET) //SDA高電平
19 #define I2C_SDA_LOW HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET) //SDA低電平
20 #define I2C_SCL_UP HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET) //SCL高電平
21 #define I2C_SCL_LOW HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET) //SCL低電平
22
23
24
25 /* 獲取 SDA SCL 引腳狀態,標準庫版也是用相同邏輯 */
26
27 #define I2C_SDA HAL_GPIO_ReadPin(GPIOC ,GPIO_PIN_8) //獲取SDA引腳狀態
28 #define I2C_SCL HAL_GPIO_ReadPin(GPIOC ,GPIO_PIN_9) //獲取SCL引腳狀態
29
30
31 void iic_stare(void); //* 開始信號
32 void i2c_ack(void); //* 應答信號
33 void I2C_No_ack(void); //* 非應答信號
34 void i2c_stop(void); //* 停止信號
35 char i2c_wit_ack(void); //* 等待應答
36 void i2c_send(uint8_t dat); //* 發送數據
37 uint8_t i2c_read(void); //* 接收數據
38
39 void SDA_OUT(void); //* SDA 設置為輸出
40 void SDA_IN(void); //* SDA 設置為輸入
41
42 void delay_us(uint32_t i); //*延時
43
44 #endif
/*****************************************************************************
* *
* File: 軟件模擬IIC, HAL庫版本,標準庫也 *
* 可用,只需要做一些相對應修改即可 *
* *
*****************************************************************************/
#include 'iic.h'
/*******************************************************************************
* 函 數 名 : i2c_stare
* 函數功能 : iic開始信號,SCL高電平時,SDA出現一個下跳沿表示啟動信號
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void i2c_stare(void)
{
SDA_OUT();
I2C_SDA_UP;
I2C_SCL_UP;
delay_us(4);
I2C_SDA_LOW; //啟動開始信號
delay_us(4);
I2C_SCL_LOW; //鉗住I2C總線,準備發送或接收數據
}
/*******************************************************************************
* 函 數 名 : i2c_stop
* 函數功能 : iic停止信號,SCL高電平時,SDA出現一個上跳沿表示停止信號
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void i2c_stop(void)
{
SDA_OUT(); //sda線輸出
I2C_SDA_LOW; //發送結束條件的數據信號
I2C_SCL_UP;
delay_us(4); //結束條件建立時間大于4μ
I2C_SDA_UP; //發送I2C總線結束信號
delay_us(4);
I2C_SCL_LOW;
}
/*******************************************************************************
* 函 數 名 : i2c_send
* 函數功能 : iic發送數據
* 輸 入 : uint8_t dat,要發送的數據
* 輸 出 : 無
*******************************************************************************/
void i2c_send(uint8_t dat)
{
unsigned char temp;
SDA_OUT();
for(temp=0x80;temp!=0;temp>>=1)
{
if((temp & dat)== 0)
{
I2C_SDA_LOW;
}
else
{
I2C_SDA_UP;
}
delay_us(1);
I2C_SCL_UP;
delay_us(4);
I2C_SCL_LOW;
}
}
/*******************************************************************************
* 函 數 名 : i2c_read
* 函數功能 : iic接收數據
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
uint8_t i2c_read(void)
{
unsigned char temp;
unsigned char dat;
I2C_SDA_UP; //釋放總線準備接收
SDA_IN();
for(temp=0x80;temp!=0;temp>>=1)
{
delay_us(1);
I2C_SCL_UP;
if(I2C_SDA==1)
{
dat|=temp;
}
else
{
dat&=~temp;
}
I2C_SCL_LOW;
}
return dat;
}
/*******************************************************************************
* 函 數 名 : i2c_wit_ack
* 函數功能 : iic等待應答
* 輸 入 : 無
* 輸 出 : 0/1,返回1表示無應答信號,返回0表示應答
*******************************************************************************/
char i2c_wit_ack(void)
{
uint8_t con=0;
I2C_SDA_UP; //釋放數據線,準備接收應答
delay_us(1);
I2C_SCL_UP; //CPU驅動SCL = 1, 此時器件會返回ACK應答
SDA_IN();
delay_us(1);
while( I2C_SDA ) //CPU讀取SDA口線狀態
{
con++;
if(con>255)
{
i2c_stop();
return 1; //無應答信號
}
}
I2C_SCL_LOW;
delay_us(1);
return 0; //有應答
}
/*******************************************************************************
* 函 數 名 : i2c_ack
* 函數功能 : iic應答信號
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
上一篇:STM32 GPIO重映射
下一篇:STM32 搶占優先級和響應優先級
推薦閱讀最新更新時間:2025-04-23 11:15



設計資源 培訓 開發板 精華推薦
- 使用 Microchip Technology 的 MSL2164 的參考設計
- 使用 NXP Semiconductors 的 PVF65GS10CMK40 的參考設計
- LT1336 的典型應用 - 具有升壓穩壓器的半橋 N 溝道功率 MOSFET 驅動器
- wyh111
- LTC3240-2.5 演示板、升壓/降壓充電泵 DC-DC 轉換器
- 使用 Seeed Technology Co.,Ltd 的 SSD1327Z 的參考設計
- MD2131 高速超聲波束成形源驅動器的典型 MD2131 應用圖
- 使用 NXP Semiconductors 的 TDA3675 的參考設計
- AD8546ARMZ-R7比較器配置A的典型應用電路
- 使用 Analog Devices 的 LTC1474CMS8-5 的參考設計
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析
- 試用Vishay新型“IHLP磁芯損耗計算器”,搶樓贏好禮
- LPC4370重磅來襲 有獎問答贏好禮!
- 電子工程師,如何更好地擁抱GaN?參與問卷有好禮!
- 報名贏京東卡 | 國產FPGA安路科技2024線上新品發布會
- 兆易GD32450I-EVAL免費測評試用
- 追更有驚喜:解救被FSM折磨過的你,justd0解析LSM6DSOX有限狀態機官方例程
- 電路圖站2.0版上線,公開征集網友建議,填寫調查問卷贏積分!
- 全球首款Cortex-M23內核物聯網芯片SAML10和SAM L11系列 闖關獲取SAML10/SAML11法寶,拆除電子界安全危機,贏好禮!
- 邀請好友體驗WEBENCH,禮品豐厚你有他也有!