MAX14830 4UART通道單發送功能實現

        MAX14830 是美信的一款SPI轉4串口芯片,用來擴展串口的。SPI最高26MHz,4個串口可配置不同的波特率,最快24MHz。硬件上的連接很簡單,參考手冊66頁上都有寫。


        通過片選CS引腳,可以用同一個SPI接口控制數個MAX14830。前期設計時就要考慮好後期需要使用的波特率,主要是買合適的晶振。推薦用有源晶振,從XIN輸入,範圍在第10頁有說明,0.5-35M。雖然內部能6 8 48 96 144倍頻,和1-63分頻,但倍頻是有範圍的,在51頁有說明。


接下來說怎麼用SPI來控制這個片子。

SPI是四線的,SCLK  MOSI MISO CS, 用硬件SPI時,MOSI和MISO不用交叉接,直連,通過配置SPI的主從來控制方向。SPI讀寫的時序如下,在58-59頁:



硬件SPI有幾個設置,速率,極性CPOL和相位CPHA。在58頁說了,2個都是0,CPOL=0,SCLK在空閒時是低電平,CPHA=0,在SCLK第一個沿,也就是上升沿採樣。

從寫時序看,CS爲低後,連着寫8位的A地址,再寫8位的D數據。讀時序看,先寫8位地址,再寫8位任意數,同時讀出8位數據。因爲SPI是主從關係的,從發數據給主都要主提供SCLK時鐘,主發送第一個數據時,也會在MISO數據線上得到8位數據,主發送第二個數據時,就會得到前面發送數據返回的數。也就是說,SPI讀寫都是一起的。這個過程可以用IO模擬也可以用硬件SPI,這裏略過。

然後說怎麼調試MAX14830。先調SPI讀寫。

unsigned char SPI_WriteRead(unsigned char reg,unsigned char data)

這個函數的功能是先寫reg,再寫data,並返回寫data時讀到的數據。

文檔28頁說明了SPI寫寄存器的格式。

首尾是讀寫控制,1 寫  0讀,U1 U0是UART地址,A4-A0是寄存器地址。


文檔54頁說。


有個擴展地址,1f是全局寄存器,往裏面寫ce,就是使用擴展地址,使用擴展地址後,地址變成0010 A3 A2 A1 A0。讀RevID來測試SPI讀寫。寫完ce後,讀RevID,再寫cd改回來。


於是,先復位,再拉高cs初始化。讀寫正確就會得到一個值,如上面所述,B4。

void MX14830_Init(void)
{
RST0_LOW();
HAL_Delay(1000);
RST0_HIGH();
CS0_HIGH();
HAL_Delay(1000);
SPI_WriteRead(0x9f,0xce));
UART_Send(SPI_WriteRead(0x25,0xff));

SPI_WriteRead(0x9f,0xcd));

}

調試好SPI後,就調試發送。簡單說,關掉Clkdisable,0x1b[6],CLKSource裏設置PLLEn關掉,用PLLBypass,使能CrytalEn,用外部有源晶振,設置波特率DVILSB,DVIMSB,0x1B裏還有小數分頻FRACT。計算方法在21頁。再配置0x0b,串口的數據長度,停止位,校驗。再使能Clkdisable,同時設置FRACT和X2 X4mode。需要注意的是紅框中的16和x2 x4mode沒有關係,這是隻是小數分頻,無論是x2 x4模式,都可以用16個小數分頻。



void MAX14830_Set(unsigned char port)

{

        SPI_WriteRead((port<<5)|0x1b|0x80,0x40);//[6] set1 to disable CLK   

SPI_WriteRead((port<<5)|0x1e|0x80,0x88);//no RTS PLLBypass no PLLEn Ex Clock
SPI_WriteRead((port<<5)|0x1c|0x80,0x01);//DVILSB
SPI_WriteRead((port<<5)|0x1d|0x80,0x00));//DVIMSB
SPI_WriteRead((port<<5)|0x09|0x80,0x88));//tx mode1
SPI_WriteRead((port<<5)|0x0b|0x80,0x03));//8bit length

SPI_WriteRead((port<<5)|0x1b|0x80,0x2c));//enable CLK, set x4 mode

}

        uart0-3要分別設置,每個uart都可以配置不同的波特率,port要移位,是u0 u1 在第5 6 位,第7 位是讀寫,寫是1,要或上1000 0000。

        最後是發送數據。

void MX14830_Send(unsigned char port,unsigned char data)
{
SPI_WriteRead(port<<5|0x80,data);//[6] set1 to disable CLK  

}

       調試波特率的時候,拿邏輯分析儀或者示波器看波形,算出波特率,看看是不是要配置的波特率,還差多少。上面的配置是1.8432M晶振,x4 mode,配置256000波特率,實際是263.314KHz,用256000Hz接收能收到,誤差2.86%。

       至於接收可以循環讀取SysInt,判斷是誰有數據,讀出來就行了,FIFO是128字節,據說太多了就不再接收,要復位才行,沒用過。

        這篇文章說明了如何看手冊上的相關信息來寫程序,簡單的調試過程,調試要一步步來,耐住性子,勉勵自己。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章