STM32模擬I2C讀寫 AT24C02

2021-10-20 16:30:52 字數 2525 閱讀 1939

多數人吐槽硬體i2c,多次測試並驗證過這個問題。

如果當收發中途斷開i2c的匯流排連線,i2c匯流排就會處於拉低占用狀態,busy位會被置位。

該為如果被設定,即使pe=0也不能將其清除。嘗試強制生成乙個停止條件時序也不能清除該位。

此時只有復位i2c整個內部外設的時鐘,i2c匯流排的忙碌占用狀態才會被釋放。然後又得重新初始化。這是頭疼得乙個地方。

模擬i2c如果出現上訴收發無應答的問題,發乙個停止訊號,再重新執行一次就可以恢復。

檢視正點原子的**,多次修改io口的輸入輸出配置,其實這個是沒有必要的。

如下便是模擬實現的**,經常用到便做乙個筆記方便拷貝。

//i2c驅動

#define i2c_scl_gpio gpiob

#define i2c_scl_pin gpio_pin_6

#define i2c_scl_set i2c_scl_gpio->bsrr = i2c_scl_pin

#define i2c_scl_clr i2c_scl_gpio->brr = i2c_scl_pin

#define i2c_sda_gpio gpiob

#define i2c_sda_pin gpio_pin_7

#define i2c_sda_set i2c_sda_gpio->bsrr = i2c_sda_pin

#define i2c_sda_clr i2c_sda_gpio->brr = i2c_sda_pin

#define i2c_sda_in i2c_sda_gpio->idr &i2c_sda_pin

//初始化iic

int iic_init(void)

init_env_export(iic_init);

//reg_shell("i2c_init", iic_init)

#define i2c_time 10

//產生iic起始訊號

void iic_start(void)

//產生iic停止訊號

void iic_stop(void)

//等待應答訊號到來

//返回值:1,接收應答失敗

// 0,接收應答成功

bool iic_wait_ack(void)

} i2c_scl_clr; //時鐘輸出0

delay_us(i2c_time / 2);

return true;

}//產生ack應答

void iic_ack(void)

//不產生ack應答

void iic_nack(void)

//iic傳送乙個位元組

//返回從機有無應答

//1,有應答

//0,無應答

void iic_send_byte(u8 txd)

else

txd <<= 1;

delay_us(i2c_time); //對tea5767這三個延時都是必須的

i2c_scl_set;

delay_us(i2c_time);

i2c_scl_clr;

delay_us(i2c_time);

} i2c_sda_clr;

delay_us(i2c_time);

}//讀1個位元組,ack=1時,傳送ack,ack=0,傳送nack

u8 iic_read_byte(unsigned char ack)

if (!ack)

iic_nack(); //傳送nack

else

iic_ack(); //傳送ack

return receive;

}#define check_ack(x) \

ack = x; \

if (ack == false) \

//addr 位址8位元組對齊 一次 一次寫入不得超過8位元組 寫入間隔不得小於10ms

bool at24c02_write(u8 addr, u8 data, int len)

} while (0);

iic_stop(); //產生乙個停止條件

return ack;

}bool at24c02_read(u8 naddr, u8 data, u8 len)

data[len - 1] = iic_read_byte(0);

} while (0);

iic_stop(); //產生乙個停止條件

return ack;

}

STM32 軟體模擬I2C

i2c的兩個引腳 scl引腳和sda引腳 需要既能輸出又能輸入,為了避免複雜的配置操作需要把該引腳配置為開漏輸出模式,該模式的說明如下圖所示 當微控制器的sda引腳配置為低電平時,sda線被拉低 當微控制器的sda引腳配置為高電平時,引腳埠為高阻態,sda線通過上拉電阻被vcc拉高。因此一定要注意在...

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...