多數人吐槽硬體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...