AKI-H8串口通信
????? 串口通信是一種通信接口簡寫SCI,它可是實現異步和同步兩種傳輸模式。可以思考一下同步和異步的區別。
????? 所謂同步就是接收方和發送方使用的是同一個時鐘,步調一致的處理數據。典型的就是CPU和內存,通過總線存取數據。特點就是快,發送方和接收方不需要什么數據格式,數據線上的數據就是當前想讀的數據,因為步調一致嘛。但是問題就是雙方的速度要一致,且總線要提供時鐘信號,否則就無法實現時鐘的統一。這樣的通信一般都在速度要求高,距離比較近的地方。
????? 異步就是發送數據的一方和接收數據的一方并不是擁有一個統一的時鐘,發送方按照一個固定的數據格式發送,接收方也是按照同一個數據格式接受,但是即使時鐘不是同一個,但是發送方和接收方所用的時鐘的頻率必須是一致的(否則在接受數據的時候如果頻率不一致不能夠辨別預先設置的數據格式,比如如果接收方的時鐘太快,那么會把本來是一個周期的低電平認為是兩個低電平信號)。目前異步通信使用的是RS232,單片機為了滿足這樣的協議都自帶UART模塊,將CPU的同步數據轉換為異步數據。
?????串口通信最基本的來說有一個數據發送端,一個數據接收端,在連接的時候只要發送端連接到接收端那么數據就可以開始工作。H8的串口模塊的發送和接受模塊都有緩沖寄存器,也就說把數據先寫到緩沖里,然后芯片自行將數據拷貝到發送寄存器里發送,接受的時候也是一樣。怎樣確認發送寄存器或者接受寄存器是不是為空,即可以工作呢?由相應的狀態寄存器的標志位來決定。這樣一來的話,串口通信的方式就有講究了,如果狀態寄存器的標志位顯示當前不能發送,發送寄存器里的數據還沒有清空,那么是等待還是立即返回呢?同樣,接受的時候,數據還沒來標志位還沒置位,是等待還是返回呢?一般來說,兩種方式都提供,在后面會提到。
串口通信的另一個問題就是波特率,以什么樣的速度發送?
??? 最后就是串口通信的數據格式,前面提到串行異步通信要使用特殊的數據格式:
起始位:一個周期的低電平。在串口通信的無數據階段是全高電平的,所以一個低電平就標志一個數據包開始傳送了。
數據位:7位或者8位的數據位,D0-D7。
檢驗位:奇\偶校驗位。
停止位:兩個高電平。
?
所以,對H8芯片的串口編程主要做以下的工作:
1:選擇是否添加奇偶校驗位
2:選擇傳輸速度
3:選擇是同步還是異步:SMR(CPU啟動時默認是異步所以不需要特別設置)。
4:選擇是否是CPU間通信:SMR(默認為不是)。
5:選擇在送信,收信時候是否發生中斷:SCR(默認不產生中斷)
6:開啟異步通信:SCR(默認關閉)
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) */
?
?
在發送和接受的時候,因為存在緩沖區不空閑的情況,必須先判斷狀態寄存器再向緩沖寄存器放讀取數據。
?
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 }
最后一個函數提供了掃描功能,僅僅是對狀態寄存器的讀取。
?
(以上)
?
?
?
轉載于:https://www.cnblogs.com/cbs-soft/archive/2009/12/28/1634056.html
總結
以上是生活随笔為你收集整理的AKI-H8串口通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-3-23
- 下一篇: ASP无组件上传带进度条