AKI-H8串口通信
????? 串口通信是一種通信接口簡寫SCI,它可是實現(xiàn)異步和同步兩種傳輸模式。可以思考一下同步和異步的區(qū)別。
????? 所謂同步就是接收方和發(fā)送方使用的是同一個時鐘,步調(diào)一致的處理數(shù)據(jù)。典型的就是CPU和內(nèi)存,通過總線存取數(shù)據(jù)。特點就是快,發(fā)送方和接收方不需要什么數(shù)據(jù)格式,數(shù)據(jù)線上的數(shù)據(jù)就是當(dāng)前想讀的數(shù)據(jù),因為步調(diào)一致嘛。但是問題就是雙方的速度要一致,且總線要提供時鐘信號,否則就無法實現(xiàn)時鐘的統(tǒng)一。這樣的通信一般都在速度要求高,距離比較近的地方。
????? 異步就是發(fā)送數(shù)據(jù)的一方和接收數(shù)據(jù)的一方并不是擁有一個統(tǒng)一的時鐘,發(fā)送方按照一個固定的數(shù)據(jù)格式發(fā)送,接收方也是按照同一個數(shù)據(jù)格式接受,但是即使時鐘不是同一個,但是發(fā)送方和接收方所用的時鐘的頻率必須是一致的(否則在接受數(shù)據(jù)的時候如果頻率不一致不能夠辨別預(yù)先設(shè)置的數(shù)據(jù)格式,比如如果接收方的時鐘太快,那么會把本來是一個周期的低電平認(rèn)為是兩個低電平信號)。目前異步通信使用的是RS232,單片機(jī)為了滿足這樣的協(xié)議都自帶UART模塊,將CPU的同步數(shù)據(jù)轉(zhuǎn)換為異步數(shù)據(jù)。
?????串口通信最基本的來說有一個數(shù)據(jù)發(fā)送端,一個數(shù)據(jù)接收端,在連接的時候只要發(fā)送端連接到接收端那么數(shù)據(jù)就可以開始工作。H8的串口模塊的發(fā)送和接受模塊都有緩沖寄存器,也就說把數(shù)據(jù)先寫到緩沖里,然后芯片自行將數(shù)據(jù)拷貝到發(fā)送寄存器里發(fā)送,接受的時候也是一樣。怎樣確認(rèn)發(fā)送寄存器或者接受寄存器是不是為空,即可以工作呢?由相應(yīng)的狀態(tài)寄存器的標(biāo)志位來決定。這樣一來的話,串口通信的方式就有講究了,如果狀態(tài)寄存器的標(biāo)志位顯示當(dāng)前不能發(fā)送,發(fā)送寄存器里的數(shù)據(jù)還沒有清空,那么是等待還是立即返回呢?同樣,接受的時候,數(shù)據(jù)還沒來標(biāo)志位還沒置位,是等待還是返回呢?一般來說,兩種方式都提供,在后面會提到。
串口通信的另一個問題就是波特率,以什么樣的速度發(fā)送?
??? 最后就是串口通信的數(shù)據(jù)格式,前面提到串行異步通信要使用特殊的數(shù)據(jù)格式:
起始位:一個周期的低電平。在串口通信的無數(shù)據(jù)階段是全高電平的,所以一個低電平就標(biāo)志一個數(shù)據(jù)包開始傳送了。
數(shù)據(jù)位:7位或者8位的數(shù)據(jù)位,D0-D7。
檢驗位:奇\偶校驗位。
停止位:兩個高電平。
?
所以,對H8芯片的串口編程主要做以下的工作:
1:選擇是否添加奇偶校驗位
2:選擇傳輸速度
3:選擇是同步還是異步:SMR(CPU啟動時默認(rèn)是異步所以不需要特別設(shè)置)。
4:選擇是否是CPU間通信:SMR(默認(rèn)為不是)。
5:選擇在送信,收信時候是否發(fā)生中斷:SCR(默認(rèn)不產(chǎn)生中斷)
6:開啟異步通信:SCR(默認(rèn)關(guān)閉)
7:清除錯誤FLAG
1 int i;2 SCI1.SCR = 0;
3 SCI1.SMR = 0; /* パリティ無し STOP1 */
4 SCI1.BRR = 80; /* 9600bps 3052 */
5 for(i=0;i<280;i++); /* wait */
6 SCI1.SCR = 0x30; /* TE = 1 , RE = 1 */
7 i = SCI1.SSR;
8 SCI1.SSR = 0x80; /* Clear Error Flag (TDRE=1) */
?
?
在發(fā)送和接受的時候,因為存在緩沖區(qū)不空閑的情況,必須先判斷狀態(tài)寄存器再向緩沖寄存器放讀取數(shù)據(jù)。
?
1 void PutSCI(char c)2 {
3 unsigned char i;
4 while( 1 )
5 {
6 i = SCI1.SSR;
7 if( i & 0x80 ) break;
8 }
9 SCI1.TDR = c;
10 SCI1.SSR = i&0x7f;
11 }
12
13 ?/*==========================================================================
14 SCI入力
15 ----------------------------------------------------------------------------
16 データを受信するまで待ちつづけます。
17 ==========================================================================*/
18 ?char GetSCI()
19 {
20 unsigned char i;
21 char c;
22 while( 1 )
23 {
24 i = SCI1.SSR;
25 if( i & 0x40 ) break;
26 }
27 c = SCI1.RDR;
28 SCI1.SSR = i&0xbf;
29 return(c);
30 }
31
32 ?/*==========================================================================
33 SCI入力データチェック
34 ----------------------------------------------------------------------------
35 SCIにデータがあるかチェックします。
36 戻り値 1 = データあり、0 = データなし
37 ==========================================================================*/
38 ?int ScanSCI()
39 {
40 if( SCI1.SSR & 0x40 ) return(1);
41 return(0);
42 }
最后一個函數(shù)提供了掃描功能,僅僅是對狀態(tài)寄存器的讀取。
?
(以上)
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/cbs-soft/archive/2009/12/28/1634056.html
總結(jié)
以上是生活随笔為你收集整理的AKI-H8串口通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-3-23
- 下一篇: ASP无组件上传带进度条