TI论坛
直播中

杨洋

7年用户 272经验值
私信 关注
[问答]

请教关于5509A的MCBSP接口通信问题

感谢您查看我的问题贴,谢谢!
我在用DSP的5509A的mcbsp接口和FPGA通信测试,测试过程是:
mcbsp1发送一个16bit的数据到fpga,mcbsp只发送不接收,只发送一次。
现在的问题出现在mcbsp这里,debug时检测不到xrdy位置1。这个问题困扰我很久了,测试一直不成功,万般无奈特来求助,望技术人员指点思路,万分感谢!期待您的回复!
下面我贴出我的配置代码,main函数不复杂很简单,都是些配置。
我觉得应该是PCR的配置和mcbsp写入数据那里有问题,其他的我感觉问题不大。我想配置的初衷是:接收帧同步由FSR脚提供,接收/发送时钟由内部的采样率发生器提供,发送帧同步脉冲由采样率发生器提供。
#include
#include
#include
#include
#include
/*锁相环的设置CPU144mhz*/
PLL_Config myConfig = [
0,
1,
12,
1
];
/*采样率发生器的输入时钟源 CPU
CPU2分频得到CLKG
单相,一帧一个字节,每字节16bit
发送/接收帧1bit延迟
发送数据在上升沿,接收数据在下降沿
发送/接收帧同步脉冲高电平使能
发送/接收时钟由内部发生器产生
发送同步脉冲由mcbsp产生,当DXR拷贝数据到XSR时产生
接收同步脉冲由外部FSR脚产生
*/
MCBSP_Config Mcbsp1Config = [
MCBSP_SPCR1_RMK(
MCBSP_SPCR1_DLB_OFF,                            /* DLB = 0,禁止自闭环方式 */
MCBSP_SPCR1_RJUST_LZF,                        /* RJUST = 2左对齐低位补0 */
MCBSP_SPCR1_CLKSTP_DISABLE,            /* CLKSTP = 0 ,禁止clock stop模式*/
MCBSP_SPCR1_DXENA_ON,                         /* DXENA = 1 ,发送延迟使能*/
0,                                                                             /* ABIS = 0 */
MCBSP_SPCR1_RINTM_RRDY,                    /* RINTM = 0 mcbsp给cpu发送中断使能*/
0,                                                                            /* RSYNCER = 0 */
MCBSP_SPCR1_RRST_DISABLE /* RRST = 0 */
),
MCBSP_SPCR2_RMK(
MCBSP_SPCR2_FREE_NO,                            /* FREE = 0 */
MCBSP_SPCR2_SOFT_NO,                             /* SOFT = 0 */
MCBSP_SPCR2_FRST_FSG,                          /* FRST = 0 */
MCBSP_SPCR2_GRST_CLKG,                       /* GRST = 0 */
MCBSP_SPCR2_XINTM_XRDY,                       /* XINTM = 0 */
0,                                                                               /* XSYNCER = N/A */
MCBSP_SPCR2_XRST_DISABLE                   /* XRST = 0 */
),

MCBSP_RCR1_RMK(
MCBSP_RCR1_RFRLEN1_OF(0),                  /* RFRLEN1 = 0 ,接收帧长1个字节*/
MCBSP_RCR1_RWDLEN1_16BIT                  /* RWDLEN1 = 2 ,一个字节16bit*/
),
MCBSP_RCR2_RMK(
MCBSP_RCR2_RPHASE_SINGLE,                 /* RPHASE = 0 ,单相*/
MCBSP_RCR2_RFRLEN2_OF(0),                  /* RFRLEN2 = 0 */
MCBSP_RCR2_RWDLEN2_8BIT,                    /* RWDLEN2 = 0 */
MCBSP_RCR2_RCOMPAND_MSB,                /* RCOMPAND = 0 */
MCBSP_RCR2_RFIG_YES,                               /* RFIG = 0 */
MCBSP_RCR2_RDATDLY_1BIT                      /* RDATDLY = 1 ,接收帧1bit数据延迟*/
),
MCBSP_XCR1_RMK(
MCBSP_XCR1_XFRLEN1_OF(0),                      /* XFRLEN1 = 0,发送帧长1个字节 */
MCBSP_XCR1_XWDLEN1_16BIT                    /* XWDLEN1 = 2 ,一个字节16bit*/

),
MCBSP_XCR2_RMK(
MCBSP_XCR2_XPHASE_SINGLE,                    /* XPHASE = 0 */
MCBSP_XCR2_XFRLEN2_OF(0),                     /* XFRLEN2 = 0 */
MCBSP_XCR2_XWDLEN2_8BIT,                       /* XWDLEN2 = 0 */
MCBSP_XCR2_XCOMPAND_MSB,                    /* XCOMPAND = 0 */
MCBSP_XCR2_XFIG_YES,                                    /* XFIG = 0 */
MCBSP_XCR2_XDATDLY_1BIT                           /* XDATDLY = 1 ,发送帧1bit延迟*/
),
MCBSP_SRGR1_DEFAULT,                                /*默认值是帧脉冲宽度是1个CLKG周期,输入频率2分频得到CLKG*/
MCBSP_SRGR2_DEFAULT,                                /*CLKSM=1*/
MCBSP_MCR1_DEFAULT,
MCBSP_MCR2_DEFAULT,
MCBSP_PCR_RMK(
MCBSP_PCR_IDLEEN_RESET,                          /* IDLEEN = 0 , 当PERIPH域空闲时,MCBSP保持使能 */
MCBSP_PCR_XIOEN_SP,                                   /* XIOEN = 0 , CLKX,FSX,DX,CLKS脚是串口脚 */
MCBSP_PCR_RIOEN_SP,                                   /* RIOEN = 0 , CLKR,FSR,DR,CLKS脚是串口脚*/
MCBSP_PCR_FSXM_INTERNAL,                        /* FSXM = 1 , 发送帧同步脉冲由内部mcbsp提供 */
MCBSP_PCR_FSRM_EXTERNAL,                       /* FSRM = 0 , 接收帧同步脉冲由外部FSR脚提供 */
0, /* DXSTAT = N/A */
MCBSP_PCR_CLKXM_OUTPUT,                        /* CLKXM = 1, 发送器时钟由采样率发生器获得,CLKX脚作为输出脚 */
MCBSP_PCR_CLKRM_INPUT,                            /* CLKRM = 0 , 接收器时钟由CLKR引脚获得*/
MCBSP_PCR_SCLKME_NO,                                /* SCLKME = 0 , 采样率时钟源来自CPU或者CLKS */
MCBSP_PCR_FSXP_ACtiVEHIGH,                       /* FSXP = 0 , 发送帧脉冲高电平使能 */
MCBSP_PCR_FSRP_ACTIVEHIGH,                     /* FSRP = 0 ,接收帧脉冲高电平使能 */
MCBSP_PCR_CLKXP_RISING,                            /* CLKXP = 0 , 发送数据被驱动在CLKX的上升沿 */
MCBSP_PCR_CLKRP_FALLING                             /* CLKRP = 0 接收数据在CLKR下降沿沿采样 */
),
MCBSP_RCERA_DEFAULT,
MCBSP_RCERB_DEFAULT,
MCBSP_RCERC_DEFAULT,
MCBSP_RCERD_DEFAULT,
MCBSP_RCERE_DEFAULT,
MCBSP_RCERF_DEFAULT,
MCBSP_RCERG_DEFAULT,
MCBSP_RCERH_DEFAULT,
MCBSP_XCERA_DEFAULT,
MCBSP_XCERB_DEFAULT,
MCBSP_XCERC_DEFAULT,
MCBSP_XCERD_DEFAULT,
MCBSP_XCERE_DEFAULT,
MCBSP_XCERF_DEFAULT,
MCBSP_XCERG_DEFAULT,
MCBSP_XCERH_DEFAULT
];
/*定义McBSP的句柄*/
MCBSP_Handle hMcbsp;
void main(void)
[
int a;
CSL_init();

/*设置系统的运行速度为140MHz*/
PLL_config(&myConfig);
/*初始化McBSP1在使用MCBSP之前必须要做的一步*/
hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
/*设置McBSP1*/
MCBSP_config(hMcbsp,&Mcbsp1Config);
/* Start Sample Rate Generator and Frame Sync */
MCBSP_start(hMcbsp, MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,0x300);
/* Enable MCBSP transmit and receive */
MCBSP_start(hMcbsp, MCBSP_RCV_START | MCBSP_XMIT_START, 0);
a = MCBSP_rrdy(hMcbsp);                                 /*定义a变量的目的是在ccs中观察a的值,即查看xrdy位是否能够为1*/
while(!a)
[]
MCBSP_write16(hMcbsp,0x1234);/*向发送寄存器DXR1写入0x1234,没有接收只发送*/     
]

回帖(10)

余少虹

2018-7-31 07:03:05
mcbsp只发送不接收,只发送一次的话,只配置transmitter部分就可以了。为什么下面的代码还要先接收再发送啊?
 
“a = MCBSP_rrdy(hMcbsp);                                 /*定义a变量的目的是在ccs中观察a的值,即查看xrdy位是否能够为1*/
while(!a)
[] 
MCBSP_write16(hMcbsp,0x1234);/*向发送寄存器DXR1写入0x1234,没有接收只发送*/     ”
]
举报

杨洋

2018-7-31 07:12:21
引用: vuywsdfwf 发表于 2018-7-31 07:03
mcbsp只发送不接收,只发送一次的话,只配置transmitter部分就可以了。为什么下面的代码还要先接收再发送啊?
 
“a = MCBSP_rrdy(hMcbsp);                                 /*定义a变量的目的是在ccs中观察a的值,即查看xrdy位是否能够为1*/

谢谢您能耐心看完这么多东西,万分感谢!
是a = MCBSP_xrdy(hMcbsp);,我复制的时候写错了,定义a的目的就是想在CCS中观察a的值看看能不能变成1。
 我想我的具体问题应该是对SPCR寄存器的RINTM,XINTM,RRDY,XRDY位的理解。我设置的是RINTM,XINTM为00,
1、那就是说 数据传输是中断方式,当DXR,DRR寄存器有8bit(假设是一字是8)时就产生中断,不用判断rrdy,xrdy的值,CPU就能进行读写操作,即可用代码:      MCBSP_write16(hMcbsp,0x1234);MCBSP_read16(hMcbsp);来直接进行读写操作,不用while语句来判断rrdy,xrdy的值了,这样理解对吗?
2、MCBSP具体指的是这两个传输路径对吗?:CPU/DMA->DXR->XSR->DX,DR->RSR->RBR->DRR-CPU/DMA
3、函数:MCBSP_write16(hMcbsp,0x1234);    是指的将0x1234从cpu写入 DXR还是从DXR写入XSR?
4、我的设置是:接收帧同步脉冲由外部提供(FPGA提供),此时需要将SPCR1.RRST位设置为1吗?
5、我使用MCBSP1,我的配置是:采样率发生器使用内部CPU时钟,有采样率发生器产生的CLKG时钟跟MCBSP1的CLKX,CLKR的关系是什么?
6、假设:MCBSP1,2的CLKR,CLKX都是由MCBSP0的CLKR提供,对于MCBSP0来说,应该设置哪个寄存器的哪些位来指明这个MCBSP0的CLKR脚是做为时钟输出脚?
问题有点多,这些基本上就是我这几天来操作MCBSP遇到的疑问,虽然看手册心里也明白点,但是我想得到一个很准确权威的答案!期待您的回复!谢谢   
举报

杨洋

2018-7-31 07:20:08
引用: vuywsdfwf 发表于 2018-7-31 07:03
mcbsp只发送不接收,只发送一次的话,只配置transmitter部分就可以了。为什么下面的代码还要先接收再发送啊?
 
“a = MCBSP_rrdy(hMcbsp);                                 /*定义a变量的目的是在ccs中观察a的值,即查看xrdy位是否能够为1*/

晚上好!
我配置的mcbsp的PCR.CLKXM=1,即发送时钟由采样率发生器提供,
采样率发生器时钟源是CPU,CPU频率为144mhz,CLKGDV=1,即CPU二分频得到CLKG=72MHZ,
手册上说CLKG用于DR,DX的位移,那CLKG不就是CLKX,CLKR的时钟吗,测量CLKX脚频率应该等于72mhz左右,但是示波器显示结果很不稳定,FSX脚频率是62.3khz倒是挺稳定的;我修改CLKGDV=11,CPU12分频得到CLKG=12MHZ,示波器测量CLKX脚依然不稳定跟之前几乎一样,测量FSX脚频率依然是62.3khz,对于这种现象不知道该怎么解释?
举报

余少虹

2018-7-31 07:38:54
引用: dfgdaf 发表于 2018-7-31 07:12
谢谢您能耐心看完这么多东西,万分感谢!
是a = MCBSP_xrdy(hMcbsp);,我复制的时候写错了,定义a的目的就是想在CCS中观察a的值看看能不能变成1。
 我想我的具体问题应该是对SPCR寄存器的RINTM,XINTM,RRDY,XRDY位的理解。我设置的是RINTM,XINTM为00,

1. 对,mcbsp发送和接收可以采用轮询(判断rrdy, xrdy=1?)和中断方式。

2. 对。
3.  从cpu写入DXR, 后面DXR写入XSR是自动完成的。

4.  需要。
5. CLKG可以产生CLKX, CLKR时钟信号。

6.  CLKRM=1。
 
举报

更多回帖

发帖
×
20
完善资料,
赚取积分