打印

DSP中用MCBSP口与PC机用RS232串口通信

[复制链接]
2279|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lijiabaobei|  楼主 | 2014-9-18 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、通信机理
(1)、协议机理
由于RS232采用的是负电平逻辑:用-3~-15V表示‘1’;用3~15表示‘0’。所以要用一个电平转换芯片来对电平进行翻转;如MAX3232,其正常工作的最大频率为200KHz;
UART协议的帧结构为:起始位+数据位+奇偶校验位+结束位,其中各位的意义如下:
起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

相关帖子

沙发
lijiabaobei|  楼主 | 2014-9-18 22:59 | 只看该作者
二、查询方式实现串口通信
(1)、实现机理
可以说这种连接方式为三线方式:发DX、收DR和收帧同步FSR;收到的数据中包含帧同步信号,负电平有效,在MCBSP中的相应的寄存器中设置,当检测到一帧的起始位0时,则产生一个接收帧同步信号,开始接收数据,接收一定的个数(在寄存器中进行设置),当一个字时,RBR中的数据拷贝到DRR中,同时rrdy接收准备好信号置位,CPU通过检测该位来决定什么时候开始读DRR获取数据。发送帧同步信号由DSP内部产生,在数据从DXR拷贝到XSR中时产生发送帧同步信号,同时发送准备好xrdy信号置位,写数据到DXR中时将发送准备好xrdy清零。当DSP检测到xrdy为零时,CPU继续向DXR中写数。
(2)、实现过程
本试验中,接收端的处理:接收的数据是有PC机用串口调试助手发送过来的数据,其中数据中包含起始位(1bit0)+数据位(8bitASCII)+终止位(1bit1);发送的波特率为38.4kbps,DSP工作的主钟频率为720MHz,MCBSP工作的频率是经过四分频后的时钟信号,频率为180MHz,为保证发送和接收的波特率相适应,则要求在DSP中对接收到的1bit数据进行24采样,及在DSP中用24bit 来表示 接收到的1bit ,由此MCBSP中寄存器SRGR中的分频比CLKGDV=180000000/(24*38.4) – 1;其值为194,试验中设置的值为195,如果出现乱码应该调整分频比。对接收到的数据进行大数判决(要设置个门限),大于门限的判为1,小于门限的判为0;最后将收到的8个字转换为8个比特的ASCII码,表示一个字符。
发送端的处理:将要发送的字符用ASCII码表示,然后将8bit的码表示成8个含有24bit的字,最后在帧头加上帧起始位0(0x000)、在帧尾加终止位1(0xFFF);即一帧中包含10个字,每个字中含有24bit。也就是在DSP这边认为的配置RS232的帧结构,与之通信。
(3)、调试过程
具体调试过程中:串口调试助手的使用,可以设置通信用的帧格式(是否有校验位和终止位的位数)、发送的波特率、COM口、发送的模式(16进制还是ASCII码)。
       调试的方法:直接与PC机相连,准备一台示波器随时观察发送出来和接受到的信号的波形,并在硬件上跟踪排查,看其是否和理论相符。如果不对,可能发送数据源和接受数据源的问题;如果没问题,在DSP或者在串口调试助手中接受的数据还不对,就应该是两端的问题了;

使用特权

评论回复
板凳
lijiabaobei|  楼主 | 2014-9-18 23:00 | 只看该作者
三、中断方式实现串口通信
(1)、 实现DSP中断需要做哪些通用工作
a、设置允许哪些非屏蔽中断
b、设置各个允许的非屏蔽中断的中断来源
c、设置开启总中断
d、设计中断向量表
e、将中断向量表通过cmd文件挂载到指令内存
f、提供中断处理函数
如果中断向量表首地址挂载的不是0地址,那么需要设置中断向量表地址寄存器,对于不同的中断源,需要做各个自己的工作,比如如果是外部中断,那么需要设置管脚极性,即由高->低产生中断抑或反之。
(2)、DSP中都支持那些中断(中断源)及中断选择寄存器的设置
DSP支持1个RESET中断,1个NMI(不可屏蔽中断),12个可屏蔽中断(INT4-15),它们具有优先级顺序,INT4最高,INT15最低。每个中断号(INT4-INT15)都可以设置任何中断来源,即在中断选择寄存器MUXH或MUXL中指定位上填写中断来源选择码,注意:中断和中断选择码得位置是 一一对应的,即INTSEL4---15 对应INT4---15;
中断来源选择码定义如下:(此内容可以通过帮助中搜索INTSEL得到)
INTSEL(Interrupt Selection Number Deion)
00000b   DSPINT                            Host port host to DSP interrupt
00001b   TINT0                             Timer 0 interrupt
00010b   TINT1                             Timer 1 interrupt
00011b   SD_INT                            EMIF SDRAM timer interrupt
00100b   EXT_INT4                          External interrupt 4
00101b   EXT_INT5                          External interrupt 5
00110b   EXT_INT6                          External interrupt 6
00111b   EXT_INT7                          External interrupt 7
01000b   EDMA_INT                         EDMA channel (0-15) interrupt
01001-01011b                                 Reserved
01100b   XINT0                             McBSP0 transmit interrupt
01101b   RINT0                              McBSP0 receive interrupt
01110b   XINT1                              McBSP1 transmit interrupt
01111b   RINT1                              McBSP1 receive interrupt
10000-11111b                                 Reserved
(3)、MCBSP中的设置:
其他的设置和查询方式的不便,只不过要在SPCR中的接受寄存器指示位(发送寄存器指示位)设置成相应的中断触发模式。

使用特权

评论回复
地板
lijiabaobei|  楼主 | 2014-9-18 23:01 | 只看该作者
四、MCBSP口的配置
void init_mcbsp_FrontPanel(void)
{
       MCBSP_Config mcbFrontPanel = {  
                     
               MCBSP_SPCR_RMK(   
                MCBSP_SPCR_FREE_DEFAULT,           
                MCBSP_SPCR_SOFT_DEFAULT,              
                MCBSP_SPCR_FRST_DEFAULT,      
                MCBSP_SPCR_GRST_YES,               //采样率发生器复位状态         
                   MCBSP_SPCR_XINTM_XRDY,          //发送准备好置位时 产生发送中断  
                //MCBSP_SPCR_XSYNCERR_DEFAULT,
                MCBSP_SPCR_XRDY_NO,                    //发送准备好 当数据写进DXR时        
                MCBSP_SPCR_XRST_YES,               //发送使能,复位状态               
                MCBSP_SPCR_DLB_OFF,           
                MCBSP_SPCR_RJUST_RZF,         
                MCBSP_SPCR_CLKSTP_DISABLE,          //取消时钟停等模式      
                MCBSP_SPCR_DXENA_OFF,            
                MCBSP_SPCR_RINTM_RRDY,                //接收准备好置位时 产生接收中断         
                //MCBSP_SPCR_RSYNCERR_DEFAULT,
                MCBSP_SPCR_RRDY_NO,            
                MCBSP_SPCR_RRST_YES                       //接收使能,复位状态      
            ),     
           
        MCBSP_RCR_RMK(  
            MCBSP_RCR_RPHASE_SINGLE,     //单相位      
            MCBSP_RCR_RFRLEN2_DEFAULT,         
            MCBSP_RCR_RWDLEN2_DEFAULT,           
            MCBSP_RCR_RCOMPAND_MSB,     //低位先传      
            MCBSP_RCR_RFIG_YES,            
            MCBSP_RCR_RDATDLY_0BIT,       //一个时钟的迟延      
            MCBSP_RCR_RFRLEN1_OF(9),      //一个帧中有10个字   
            MCBSP_RCR_RWDLEN1_24BIT,     //一个字中有24bit
            MCBSP_RCR_RWDREVRS_DISABLE        
            ),           
      
         
        MCBSP_XCR_RMK(  
            MCBSP_XCR_XPHASE_SINGLE,    //单相位   
            MCBSP_XCR_XFRLEN2_DEFAULT,         
            MCBSP_XCR_XWDLEN2_DEFAULT,           
            MCBSP_XCR_XCOMPAND_MSB,        
            MCBSP_XCR_XFIG_YES,      
            MCBSP_XCR_XDATDLY_1BIT,           
            MCBSP_XCR_XFRLEN1_OF(9),      //一个帧中有10个字      
            MCBSP_XCR_XWDLEN1_24BIT,     //一个字中有24bit     
                 MCBSP_XCR_XWDREVRS_DISABLE        
            ),                  

              
        MCBSP_SRGR_RMK(  
            MCBSP_SRGR_GSYNC_FREE,               
            MCBSP_SRGR_CLKSP_DEFAULT,              
            MCBSP_SRGR_CLKSM_INTERNAL,  //采样率产生时钟由内部CPU时钟来驱动         
            MCBSP_SRGR_FSGM_DXR2XSR,  //传输帧同步信号 数据由DXR拷贝到XSR时产生     
            MCBSP_SRGR_FPER_DEFAULT,     //对CLKG 进行10分频得到FSG的周期 (没用了)              
            MCBSP_SRGR_FWID_DEFAULT,     //控制帧脉冲的宽度(没用了)
            MCBSP_SRGR_CLKGDV_OF(0xC2) //由DSP工作的主钟频率、波特率决定              
        ),  
         
         
        MCBSP_MCR_DEFAULT,                        
         
            MCBSP_RCERE0_DEFAULT,  
            MCBSP_RCERE1_DEFAULT,  
            MCBSP_RCERE2_DEFAULT,  
            MCBSP_RCERE3_DEFAULT,   
         
         
            MCBSP_XCERE0_DEFAULT,  
            MCBSP_XCERE1_DEFAULT,  
            MCBSP_XCERE2_DEFAULT,  
            MCBSP_XCERE3_DEFAULT,   
         
            
        MCBSP_PCR_RMK(  
            MCBSP_PCR_XIOEN_SP,          //串口工作模式     
            MCBSP_PCR_RIOEN_SP,               
            MCBSP_PCR_FSXM_INTERNAL,     //发送帧同步信号由内部产生     
            MCBSP_PCR_FSRM_EXTERNAL,     //接收帧同步信号由外部产生         
            MCBSP_PCR_CLKXM_OUTPUT,      //内部提供发送时钟        
            MCBSP_PCR_CLKRM_OUTPUT,      //内部提供接收时钟
            MCBSP_PCR_CLKSSTAT_0,                 
            MCBSP_PCR_DXSTAT_0,               
            MCBSP_PCR_FSXP_ACTIVELOW,      //帧同步信号低有效            
            MCBSP_PCR_FSRP_ACTIVELOW,            
            MCBSP_PCR_CLKXP_RISING,        //上升沿发送数据
            MCBSP_PCR_CLKRP_FALLING      //下降沿接收数据
        )  
    };
      
hMcbspFrontPanel = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);
MCBSP_config(hMcbspFrontPanel, &mcbFrontPanel);//初始化状态下,对各个寄存器的配置

MCBSP_start(hMcbspFrontPanel,MCBSP_RCV_START | MCBSP_XMIT_START | MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,0x3000u);
}

使用特权

评论回复
5
edishen| | 2014-9-18 23:08 | 只看该作者
学习啦

使用特权

评论回复
6
edishen| | 2014-9-18 23:09 | 只看该作者
分享是美德

使用特权

评论回复
7
walter040422| | 2014-9-20 10:47 | 只看该作者
好棒啊

使用特权

评论回复
8
comeon201208| | 2014-9-20 19:04 | 只看该作者
数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

使用特权

评论回复
9
comeon201208| | 2014-9-20 19:05 | 只看该作者
接收的数据是有PC机用串口调试助手发送过来的数据,其中数据中包含起始位(1bit0)+数据位(8bitASCII)+终止位(1bit1);发送的波特率为38.4kbps,DSP工作的主钟频率为720MHz,MCBSP工作的频率是经过四分频后的时钟信号,频率为180MHz。

使用特权

评论回复
10
edishen| | 2014-9-21 16:18 | 只看该作者
楼上的威武

使用特权

评论回复
11
lijiabaobei|  楼主 | 2014-9-21 16:20 | 只看该作者
comeon201208 发表于 2014-9-20 19:04
数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因 ...

多 刚开始我也是这样想的

使用特权

评论回复
12
lijiabaobei|  楼主 | 2014-9-21 16:21 | 只看该作者
edishen 发表于 2014-9-18 23:09
分享是美德

多谢 请多照顾

使用特权

评论回复
13
lijiabaobei|  楼主 | 2014-9-21 16:21 | 只看该作者
edishen 发表于 2014-9-21 16:18
楼上的威武

多谢

使用特权

评论回复
14
zhangmangui| | 2014-9-21 21:17 | 只看该作者
lijiabaobei 发表于 2014-9-18 23:00
三、中断方式实现串口通信
(1)、 实现DSP中断需要做哪些通用工作
a、设置允许哪些非屏蔽中断

分享很详细  也很全面   支持

使用特权

评论回复
15
edishen| | 2014-9-22 21:50 | 只看该作者
lijiabaobei 发表于 2014-9-21 16:21
多谢

一起学习啊  

使用特权

评论回复
16
lijiabaobei|  楼主 | 2014-9-22 22:52 | 只看该作者
edishen 发表于 2014-9-22 21:50
一起学习啊

多向大神请教

使用特权

评论回复
17
lijiabaobei|  楼主 | 2014-9-22 22:52 | 只看该作者
zhangmangui 发表于 2014-9-21 21:17
分享很详细  也很全面   支持

多谢版主鼓励

使用特权

评论回复
18
lijiabaobei|  楼主 | 2014-9-29 17:38 | 只看该作者
资料希望能够帮助到大家 结贴啦

使用特权

评论回复
19
snowman898| | 2015-7-3 07:39 | 只看该作者
非常感谢楼主,收藏中~

使用特权

评论回复
20
李大家| | 2016-11-17 17:26 | 只看该作者
lijiabaobei 发表于 2014-9-18 23:01
四、MCBSP口的配置
void init_mcbsp_FrontPanel(void)
{

请问你是怎么设置DX引脚空闲状态的电平呢?现在我遇到问题DX引脚空闲状态一直为0.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

286

帖子

1

粉丝