|
初學(xué)單片機(jī)求大神指點(diǎn)迷津。我按照教程抄了個(gè)EEPROM的讀寫程序,對(duì)EEPROM寫入一個(gè)字節(jié)后掛起SDA=1,然后置SCL=0等待SDA響應(yīng)(即SDA會(huì)變?yōu)?).
可是我用Keil4做單步運(yùn)行,發(fā)現(xiàn)SDA=1后SDA就一直為1, SCL=0后SDA也還是為0. 這究竟是怎么回事? 難道用Keil4調(diào)試是沒有響應(yīng)的嗎?一定要燒錄到開發(fā)板后才有反應(yīng)?
- /*******************************************************************************
- * 函數(shù)名 : I2cSendByte(unsigned char dat)
- * 函數(shù)功能 : 通過(guò)I2C發(fā)送一個(gè)字節(jié)。在SCL時(shí)鐘信號(hào)高電平期間,保持發(fā)送信號(hào)SDA保持穩(wěn)定
- * 輸入 : num
- * 輸出 : 0或1。發(fā)送成功返回1,發(fā)送失敗返回0
- * 備注 : 發(fā)送完一個(gè)字節(jié)SCL=0,SDA=1
- *******************************************************************************/
- unsigned char I2cSendByte(unsigned char dat)
- {
- unsigned char a=0,b=0;//最大255,一個(gè)機(jī)器周期為1us,最大延時(shí)255us。
- for(a=0;a<8;a++)//要發(fā)送8位,從最高位開始
- {
- SDA=dat>>7; //起始信號(hào)之后SCL=0,所以可以直接改變SDA信號(hào)
- dat=dat<<1;
- Delay10us();
- SCL=1;
- Delay10us();//建立時(shí)間>4.7us
- SCL=0;
- Delay10us();//時(shí)間大于4us
- }
- SDA=1;
- Delay10us();
- SCL=1;
- while(SDA)//等待應(yīng)答,也就是等待從設(shè)備把SDA拉低
- {
- b++;
- if(b>200) //如果超過(guò)2000us沒有應(yīng)答發(fā)送失敗,或者為非應(yīng)答,表示接收結(jié)束
- {
- SCL=0;
- Delay10us();
- return 0;
- }
- }
- SCL=0;
- Delay10us();
- return 1;
- }
復(fù)制代碼
|
|