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 ClockSPI_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字节,据说太多了就不再接收,要复位才行,没用过。
这篇文章说明了如何看手册上的相关信息来写程序,简单的调试过程,调试要一步步来,耐住性子,勉励自己。