1. 程式人生 > >NXP 飛思卡爾 S12Z 系列微控制器 SCI 設定(解決SCI已經設定完成,但卻無法通訊的問題)

NXP 飛思卡爾 S12Z 系列微控制器 SCI 設定(解決SCI已經設定完成,但卻無法通訊的問題)

  近日在使用了飛思卡爾S12Z設定SCI後總是不出資料,明明按照前代微控制器S12Z的方法設定好了,為什麼又不能用了呢?

       下面是我簡單對SCI1的設定,僅僅這樣設定是出不來資料的:

1 SCI1BD = GLOBAL_BUS_CLOCK / SCI1_BAUD_RATE;
2 SCI1CR2 = SCI1CR2_RE_MASK + SCI1CR2_TE_MASK + SCI1CR2_RIE_MASK;

        在上面的設定中我僅僅設定了SCI1的設定,假設了S12Z與S12一樣,不存在同一口多個功能複用的情況。可實際上確實,在S12Z系列微控制器中大量存在複用引腳的情況,也就是說一個引腳除了原本基本的功能外,還複用了SCI,SPI等通訊口(這裡要吐槽這個垃圾文件了,明明是可以在SCI的這一章裡面提一下可能存在多功能複用同一個口的情況的)。不管怎麼說後來還是在Port章中見到了這個S12Z引腳設定,先看看引腳複用功能的情況:

       自文件中我們可以看到PS0 - PS3 都複用了其他的功能, 觀察一下可以發現SCI1可以既在PS0, PS1 又可以在PS2和PS3口輸出,如果要只在PS2, PS3使用SCI1功能怎麼辦呢?在PIM這節中對暫存器的解釋中就找到了我們需要的暫存器:

       MODRR0這個暫存器有詳細的解釋,但是需要注意的是,在Normal Mode情況下(也就是我們沒有設定過執行模式的情況下),這個暫存器只能有一次寫操作,這就意味著對它當中的多個功能模式進行修改時需要一次寫入。由於某個引腳可能會複用多個功能,我們在設定完成後一定要保證只有一個功能可以獨佔此引腳,否則設定的結果同樣可能出錯。下面是上述MODRR0暫存器各bit的定義:

  可以看到,如果我需要讓PS2, PS3只使用SCI1功能。對SPI0RR,以及SCI1RR位均需要設定,而且只能一次性設定,那麼在匯入庫函式的情況下可以這樣:

1 MODRR0 |= MODRR0_SCI1RR_MASK +  MODRR0_SPI0RR_MASK;
2 SCI1BD = GLOBAL_BUS_CLOCK / SCI1_BAUD_RATE;
3 SCI1CR2 = SCI1CR2_RE_MASK + SCI1CR2_TE_MASK + SCI1CR2_RIE_MASK;

  若直接設定可以這樣:

1 MODRR0 |= 0x18;
2 SCI1BD = GLOBAL_BUS_CLOCK / SCI1_BAUD_RATE;
3 SCI1CR2 = 0x2c;

      應當注意的是,S12Z開始類似於STM32在同一引腳上實現了多種功能的複用,在SCI0, LIN, CAN通訊的引腳設定中一定要多考慮到引腳複用功能的設定。

      注: 本系列文章均為原創,如有轉載引用請標明來源