串列埠和通訊2

2021-09-25 04:59:28 字數 2251 閱讀 3793

繼續說iic

1、起始訊號

void iic_start(void)

sda設定為輸出,然後拉高,時鐘線拉高,等待四微秒,然後再時鐘線高的情況下拉低sda,形成下降沿,再等待4微秒,時鐘線才可以拉低。也就是說要在時鐘線高的情況下使sda形成下降沿,同時還要注意邊沿前後必須要有4微秒的等待時間。

2、結束訊號

void iic_stop(void)

將資料線sda設定為輸出,將時鐘線拉低,然後sda拉低,等待4us,時鐘線拉高,然後將資料線sda拉高,再等待4us,作為終止訊號。

簡單來講就是在scl高電平期間使sda有上公升沿,但要注意時sda拉低,鐘線拉高之前必須有4us的等待,sda上公升沿之後也要有4us的等待。

3、等待應答

u8 iic_wait_ack(void)

} iic_scl=0;

return 0;

}

將sda線設定為輸入,sda線拉高,等待1us,scl線拉高,等待1us,然後開始讀sda線狀態,如果低,那麼返回值為0,意思就是接收到了應答訊號,如果查詢了250次之後sda還是不為低,那麼說明沒有應答,返回之為1,並由主機發出終止訊號。

4、產生應答與不產生應答

void iic_ack(void)  //產生應答

void iic_nack(void) //不產生應答

對於產生應答訊號,scl線拉低,sda設為輸出並拉低,等待2us,然後時鐘線拉高,等待2us,然後拉低時鐘線。即為產生乙個應答訊號。

對於非應答訊號,過程完全相同,只是sda始終保持為高。

以下是別處抄的:

傳送器每傳送乙個位元組,就在時鐘脈衝9期間釋放資料線,由接收器反饋乙個應答訊號。

應答訊號為低電平時,規定為有效應答位(ack簡稱應答位),表示接收器已經成功地接收了該位元組;應答訊號為高電平時,規定為非應答位(nack),一般表示接收器接收該位元組沒有成功。

對於反饋有效應答位ack的要求是,接收器在第9個時鐘脈衝之前的低電平期間將sda線拉低,並且確保在該時鐘的高電平期間為穩定的低電平。

如果接收器是主控器,則在它收到最後乙個位元組後,傳送乙個nack訊號,以通知被控傳送器結束資料傳送,並釋放sda線,以便主控接收器傳送乙個停止訊號p。

微控制器作為主機時,外設模組作為從機時:

對於資料寫,即資料傳送,模組接收到資料後會返回應答訊號,微控制器作為接受應答的一方,此時的時鐘仍然由主機控制,模組只負責拉低或拉高sda線。

對於資料讀,即資料接收,主機接受完成後應該發出應答,此時的時鐘線仍然是主機控制,然後相應的將sda設定為高或低。

總之不管是傳送應答還是接受應答,第九個時鐘都由主機控制。

到這裡應該差不多搞清楚了。

5、傳送1byte

void iic_send_byte(u8 txd)

}

不具體說了,先發高位再低位。在scl低時才能改變sda電平,且改變sda電平後要等待2us,才能將scl拉高,拉高後要維持2us,然後拉低,拉低之後還要維持2us,才能進行下次sda的改變。

6、接收1byte

u8 iic_read_byte(unsigned char ack)

if (!ack)

iic_nack();

else

iic_ack();

return receive;

}

拉低時鐘線,等待2us,實際是等待模組低電平時改變資料。然後拉高,因為高電平時的sda是穩定的,因此此時將資料讀入,之後等待1us,再進行下一迴圈。

可以發現傳送位元組要比接收耗時更長?好像收發並不太同步。。。。不知道為什麼,可能時鐘線總是主機發出的,所以在與模組通訊的時候並不會有不同步。模組只需要在scl上公升沿時移位並讀取sda(主機傳送),在下降沿將資料移位到sda(主機接收),嗯。。。差不多就是這樣。

嗯就到這裡吧,算是把通訊這些亂七八糟的東西理清楚了(並沒有很清楚),接下來看一看例程裡的模組使用,分別是w25q128(spi),24c02(iic),mpu6050(iic),nrf24l01(spi)

理一遍加深理解,並學習常用模組的通訊和讀取的規律。

串列埠通訊 2

串列埠通訊 非同步通訊方式 序列通訊可以分為兩種型別 同步通訊 非同步通訊。1.非同步通訊的特點及資訊幀格式 以起止式非同步協議為例,下圖顯示的是起止式一幀資料的格式 圖1起止式非同步通訊的特點是 乙個字元乙個字元地傳輸,每個字元一位一位地傳輸,並且傳輸乙個字元時,總是以 起始位 開始,以 停止位 ...

QT 串列埠通訊2

自動識別com口 通過讀登錄檔實現 當然linux下不可用 class mainwindow public qmainwindow,public ui mainwindowclass public qstring getcomm int index,qstring keyorvalue 讀取鍵名 p...

串列埠同步通訊和串列埠非同步通訊

串列埠掃盲貼 現實中不存在絕對精確的時鐘,標稱值同樣是1mhz,發端和接收端的時鐘總會存在差異,如果接收端不進行時鐘同步,而是使用自己本地的時鐘,則足夠長的時間後接收到的資料總會出現不可預知的重複或丟失,導致接收錯誤。因此發端必須將與資料速率相關的時鐘訊號傳輸給接收端,時鐘訊號可以走單獨的訊號線,也...