5509A用串口1外接485芯片做串口通信,DSP这边的波特率设置的是串口助手的16倍,数据格式也参照网上的说法,DSP发16bit,串口接收1bit。但发送的数据和接收的数据不一致。用示波器接收DSP的S13/DX1脚发送的信号,发现只有当波特率大于16*56000时,示波器显示的数据才正常,当波特率低的时候,会出现数据丢失。且用示波器观测数据的时钟,却跟DSP的波特率不一致。
望高手赐教。
Tony Tang:
你是用McBSP模拟串口吧。
肯定是McBSP的配置不对了,如果有需要,请把相应的配置代码发上来看一下。
wen liu:
回复 Tony Tang:
是的,用多通道缓冲串口模拟,直接与485芯片连接,最开始在文献中看到描述McBSP做串口都是16倍的关系,我参照McBSP中配置下来,设置串口波特率和串口助手波特率16倍的关系,输出一直是乱码。后面看资料才知道异步串口uart才满足16倍波特率的关系。我现在用McBSP做串口发,能正常发送数据(偶尔会有乱码),但是串口波特率和串口助手波特率之间的关系时钟没搞清,我在调试过程中是通过不断修改CLKGDV的值,才实现其正常发送的。
void InitMcBSP(MCBSP_Handle hMcbsp,Uint16 DataLen){ MCBSP_FSETH(hMcbsp, SPCR2, FRST,0); //Sample Rate Generator Reset MCBSP_FSETH(hMcbsp, SPCR2, GRST,0); //Frame-Sync Logic Reset MCBSP_FSETH(hMcbsp, SPCR2, XRST,0); //Transmitter Reset MCBSP_FSETH(hMcbsp, PCR, XIOEN,0); //Set Transmitter Pins to Operate as McBSP Pins MCBSP_FSETH(hMcbsp, SPCR1, DLB,0); //关闭闭环模式 MCBSP_FSETH(hMcbsp, SPCR1,CLKSTP,0x0);//Disabling the Clock Stop Mode MCBSP_FSETH(hMcbsp, MCR2,XMCM,0x0);//必须通过xcers寄存器选择通道 MCBSP_FSETH(hMcbsp,XCR2,XPHASE,0);//One Phases for the Transmit Frame MCBSP_FSETH(hMcbsp,XCR1,XWDLEN1,0x2);//16bit MCBSP_FSETH(hMcbsp,XCR1,XFRLEN1,0x9);//一帧 10 个字 MCBSP_FSETH(hMcbsp,XCR2,XFIG,1);//忽略错误FSR脉冲 MCBSP_FSETH(hMcbsp,XCR2,XCOMPAND,0x0);//非压缩 MCBSP_FSETH(hMcbsp,XCR2,XDATDLY,0x0);//延时1bit ??/? MCBSP_FSETH(hMcbsp,SPCR1,DXENA,0);//关闭DX延时 MCBSP_FSETH(hMcbsp,SPCR2,XINTM,0);//XRDY由0变1,发出XINT信号 MCBSP_FSETH(hMcbsp,PCR,FSXM,1);//内部产生发送帧同步信号 MCBSP_FSETH(hMcbsp,SRGR2,FSGM,0);//发送帧同步信号由 McBSP 本身产生 MCBSP_FSETH(hMcbsp,PCR,FSXP,1);//发送帧同步信号di有效 MCBSP_FSETH(hMcbsp,PCR,CLKXM,0x1);//发送时钟信号有采样率产生器产生 MCBSP_FSETH(hMcbsp,PCR,CLKXP,0x0);//发送时钟上升沿有效 MCBSP_FSETH(hMcbsp,SRGR1,CLKGDV,0xa7); MCBSP_FSETH(hMcbsp,SRGR2,GSYNC,0x0);//采样率时钟自由运行,为内部时钟 MCBSP_FSETH(hMcbsp,PCR,SCLKME,0x0); MCBSP_FSETH(hMcbsp,SRGR2,CLKSM,0x1);//Sample rate generator clock derived from McBSP internal input clock MCBSP_FSETH(hMcbsp,SRGR2,CLKSP,0x0); MCBSP_FSETH(hMcbsp,PCR,CLKXP,0x1);//发送时钟下降沿有效 MCBSP_FSETH(hMcbsp,XCERA,XCE0,0x1);//通道选择 MCBSP_FSETH(hMcbsp, SPCR2, GRST,1); //启动采样率发生器 asm(" nop "); asm(" nop "); MCBSP_FSETH(hMcbsp, SPCR2, XRST,1); //启动发送器 MCBSP_FSETH(hMcbsp, SPCR2,FRST,1); //启动帧同步 asm(" nop "); asm(" nop ");}
上述代码是串口发初始化配置,我是照着TI文档中的描述配置的。
请看看,是不是配置上面存在问题。
还有就是硬件电路上的连接:接收引脚DR和接收帧同步引脚FSR是否必须连接在一起。