STM32 軟體模擬I2C

2022-06-27 15:00:19 字數 2699 閱讀 3062

i2c的兩個引腳(scl引腳和sda引腳)需要既能輸出又能輸入,為了避免複雜的配置操作需要把該引腳配置為開漏輸出模式,該模式的說明如下圖所示:

當微控制器的sda引腳配置為低電平時,sda線被拉低;當微控制器的sda引腳配置為高電平時,引腳埠為高阻態,sda線通過上拉電阻被vcc拉高。因此一定要注意在進行i2c通訊時確保sda線和scl線外接上拉電阻。

1、i2c軟體延時

/*

* * @brief 模擬i2c延時

* @retval none

* @author mr.w

* @date 2020-10-12 */

static

void analog_i2c_delay(void

)

2、i2c引腳初始化

/*

* * @brief 軟體模擬i2c初始化

* @retval none

* @author mr.w

* @date 2020-10-12 */

void bsp_analog_i2c_init(void);

__hal_rcc_gpiob_clk_enable();

/*configure gpio pins : pb6 pb7

*/gpio_initstruct.pin = gpio_pin_6|gpio_pin_7;

gpio_initstruct.mode =gpio_mode_output_od;

gpio_initstruct.pull =gpio_nopull;

gpio_initstruct.speed =gpio_speed_freq_high;

hal_gpio_init(gpiob, &gpio_initstruct);

bsp_analog_i2c_stop();

}

3、i2c開始

/*

* * @brief i2c 開始,scl為高電平的時候sda產生乙個下降沿訊號

* @retval none

* @author mr.w

* @date 2020-10-12 */

void bsp_analog_i2c_start(void

)

4、i2c停止

/*

* * @brief i2c 停止,scl為高電平的時候sda產生乙個上公升沿訊號

* @retval none

* @author mr.w

* @date 2020-10-12 */

void bsp_analog_i2c_stop(void

)

5、i2c等待響應

/*

* * @brief i2c 等待響應

* @retval none

* @author mr.w

* @date 2020-10-12 */

uint8_t bsp_analog_i2c_wait_ack(

void

) }

i2c_scl_low();

analog_i2c_delay();

return1;

}

6、i2c響應

/*

* * @brief i2c 響應

* @retval none

* @author mr.w

* @date 2020-10-12 */

void bsp_analog_i2c_ack(void

)

7、i2c不響應

/*

* * @brief i2c 不響應

* @retval none

* @author mr.w

* @date 2020-10-12 */

void bsp_analog_i2c_nack(void

)

8、i2c傳送乙個位元組資料

/*

* * @brief i2c 傳送乙個位元組資料

* @retval none

* @author mr.w

* @date 2020-10-12 */

void

bsp_analog_i2c_send_byte(uint8_t data)

else

analog_i2c_delay();

i2c_scl_high();

analog_i2c_delay();

i2c_scl_low();

if(i == 7

)

data

<<= 1

; analog_i2c_delay();}}

9、i2c接收乙個位元組資料

/*

* * @brief i2c 讀乙個位元組資料

* @retval none

* @author mr.w

* @date 2020-10-12 */

uint8_t bsp_analog_i2c_read_byte(

void

) i2c_scl_low();

analog_i2c_delay();

}return

data;

}

#endif

STM32模擬I2C讀寫 AT24C02

多數人吐槽硬體i2c,多次測試並驗證過這個問題。如果當收發中途斷開i2c的匯流排連線,i2c匯流排就會處於拉低占用狀態,busy位會被置位。該為如果被設定,即使pe 0也不能將其清除。嘗試強制生成乙個停止條件時序也不能清除該位。此時只有復位i2c整個內部外設的時鐘,i2c匯流排的忙碌占用狀態才會被釋...

STM32之I2C 學習筆記

1 i2c是兩線式序列匯流排,由資料線sda和時鐘scl構成的序列匯流排,可傳送和接收資料。在cpu與被控ic之間 ic與ic之間進行雙向傳送,高速iic匯流排一般可達400kbps以上。2 iic是半雙工通訊方式,也就是說它既可以接收也可以傳送,但是由於它只有一根資料線,所以接收和傳送不能同時進行...

STM32之I2C模組除錯總結

前一段時間對stm32的i2c模組進行了除錯,今天做乙個總結。關於i2c協議的知識,這裡就不再贅述,網上有很多介紹i2c協議的文章。目前實現i2c協議的方式有兩種,一是採用gpio口來模擬i2c協議,另外一種是使用stm32自帶的i2c模組。雖說使用gpio口模擬i2c協議較為複雜,需要詳細了解i2...