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