i2c的兩個引腳(scl引腳和sda引腳)需要既能輸出又能輸入,為了避免複雜的配置操作需要把該引腳配置為開漏輸出模式,該模式的說明如下圖所示:
當微控制器的sda引腳配置為低電平時,sda線被拉低;當微控制器的sda引腳配置為高電平時,引腳埠為高阻態,sda線通過上拉電阻被vcc拉高。因此一定要注意在進行i2c通訊時確保sda線和scl線外接上拉電阻。
1、i2c軟體延時
/*2、i2c引腳初始化* * @brief 模擬i2c延時
* @retval none
* @author mr.w
* @date 2020-10-12 */
static
void analog_i2c_delay(void
)
/*3、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();
}
/*4、i2c停止* * @brief i2c 開始,scl為高電平的時候sda產生乙個下降沿訊號
* @retval none
* @author mr.w
* @date 2020-10-12 */
void bsp_analog_i2c_start(void
)
/*5、i2c等待響應* * @brief i2c 停止,scl為高電平的時候sda產生乙個上公升沿訊號
* @retval none
* @author mr.w
* @date 2020-10-12 */
void bsp_analog_i2c_stop(void
)
/*6、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;
}
/*7、i2c不響應* * @brief i2c 響應
* @retval none
* @author mr.w
* @date 2020-10-12 */
void bsp_analog_i2c_ack(void
)
/*8、i2c傳送乙個位元組資料* * @brief i2c 不響應
* @retval none
* @author mr.w
* @date 2020-10-12 */
void bsp_analog_i2c_nack(void
)
/*9、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();}}
/*#endif* * @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;
}
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...