将F2812的McBSP配置成SPI主模式来读取AD芯片的转换数据,因为不需要对这个AD芯片进行配置,所以不需要发送数据给这个芯片,因此,我把MDRA接口配置成通用I/O口,来作为AD芯片的启动信号,因为有3个从设备,所以至少要有两个片选信号,将MFSRA和MFSXA配置成通用I/O口,作为片选信号,不知道这么做是否正确。。。
然后先将程序下载到内部RAM,进行调试,因为不需要对这个AD芯片进行配置,所以发送伪数据来启动数据传输,但是最后读取的数据不对。。。AD芯片是下降沿读取数据。下面是McBSP的配置情况:
McbspaRegs.SPCR2.bit.XRST = 0;
McbspaRegs.SPCR1.bit.RRST = 0;
McbspaRegs.SPCR2.bit.GRST = 0;
McbspaRegs.SPCR1.bit.CLKSTP = 0x03;
McbspaRegs.PCR.bit.CLKXP = 1;
McbspaRegs.PCR.bit.CLKRP = 1;
McbspaRegs.PCR.bit.SCLKME = 0;
McbspaRegs.PCR.bit.CLKXM = 1;
McbspaRegs.PCR.bit.FSXM = 1;
McbspaRegs.PCR.bit.FSRM = 1;
McbspaRegs.XCR2.bit.XDATDLY = 1;
McbspaRegs.RCR2.bit.RDATDLY = 1;
McbspaRegs.RCR1.bit.RWDLEN1 = 2;
McbspaRegs.XCR1.bit.XWDLEN1 = 2;
McbspaRegs.SRGR1.bit.CLKGDV = 0x0E;
McbspaRegs.SRGR2.bit.FSGM = 0;
McbspaRegs.SRGR2.bit.CLKSM= 1;
asm(" RPT #5 || NOP ");
McbspaRegs.SPCR2.bit.GRST = 1;
asm(" RPT #140 || NOP ");
McbspaRegs.SPCR2.bit.XRST = 1;
McbspaRegs.SPCR1.bit.RRST = 1;
asm(" RPT #140 || NOP ");
困扰很久了,哪位高人指导一下,不甚感激
mangui zhang:
Mcbsp可以配置成兼容SPI协议的模式(时钟停止模式),配置成SPI后,有几点需要注意:
1. 片选CS有效(拉低)到有效数据输出之间的时间间隔与Mcbsp时钟有关系,据我的观察,这个时间不是太固定,为了满足有些从器件的时序要求,可能需要调节Mcbsp时钟;
2. SPI输出的FIFO功能很是奇怪,除非你一直有大流量的数据需要传输,不然,不推荐使用这个功能,当需要传输的数据为0之前,如果不在FIFO发送中断中处理中断使能位,一旦需要传输的数据为0,则程序就会陷入FIFO中断的死循环,我的观察是这样,不知道寄存器的配置是否正确,仅供参考!
将F2812的McBSP配置成SPI主模式来读取AD芯片的转换数据,因为不需要对这个AD芯片进行配置,所以不需要发送数据给这个芯片,因此,我把MDRA接口配置成通用I/O口,来作为AD芯片的启动信号,因为有3个从设备,所以至少要有两个片选信号,将MFSRA和MFSXA配置成通用I/O口,作为片选信号,不知道这么做是否正确。。。
然后先将程序下载到内部RAM,进行调试,因为不需要对这个AD芯片进行配置,所以发送伪数据来启动数据传输,但是最后读取的数据不对。。。AD芯片是下降沿读取数据。下面是McBSP的配置情况:
McbspaRegs.SPCR2.bit.XRST = 0;
McbspaRegs.SPCR1.bit.RRST = 0;
McbspaRegs.SPCR2.bit.GRST = 0;
McbspaRegs.SPCR1.bit.CLKSTP = 0x03;
McbspaRegs.PCR.bit.CLKXP = 1;
McbspaRegs.PCR.bit.CLKRP = 1;
McbspaRegs.PCR.bit.SCLKME = 0;
McbspaRegs.PCR.bit.CLKXM = 1;
McbspaRegs.PCR.bit.FSXM = 1;
McbspaRegs.PCR.bit.FSRM = 1;
McbspaRegs.XCR2.bit.XDATDLY = 1;
McbspaRegs.RCR2.bit.RDATDLY = 1;
McbspaRegs.RCR1.bit.RWDLEN1 = 2;
McbspaRegs.XCR1.bit.XWDLEN1 = 2;
McbspaRegs.SRGR1.bit.CLKGDV = 0x0E;
McbspaRegs.SRGR2.bit.FSGM = 0;
McbspaRegs.SRGR2.bit.CLKSM= 1;
asm(" RPT #5 || NOP ");
McbspaRegs.SPCR2.bit.GRST = 1;
asm(" RPT #140 || NOP ");
McbspaRegs.SPCR2.bit.XRST = 1;
McbspaRegs.SPCR1.bit.RRST = 1;
asm(" RPT #140 || NOP ");
困扰很久了,哪位高人指导一下,不甚感激
mangui zhang:
1.McBSP接口总共有几个?每个McBSP接口有几根pin?
TMS320F28335总共有两个McBSP接口。每个接口有六根pin, 分别是:MFSX, MFSR, MCLKX, MCLKR, MDX, MDR。
2.McBSP用于SPI模式时使用那些pin?他们和标准SPI pin的对应关系是什么?
SPICLK->MCLKX
SPISIMO->MDX
SPISOMI->MDR
SPISTE->MFSX
SPITXINT->
SPIRXINT->
3.McBSP如何开启clock stop mode以兼容SPI接口?
通过CLKSTP、CLKXP和CLKRP来配置时钟的极性和延时的SPI兼容模式。
1.McBSP接口总共有几个?每个McBSP接口有几根pin?
TMS320F28335总共有两个McBSP接口。每个接口有六根pin, 分别是:MFSX, MFSR, MCLKX, MCLKR, MDX, MDR。
2.McBSP用于SPI模式时使用那些pin?他们和标准SPI pin的对应关系是什么?
SPICLK->MCLKX
SPISIMO->MDX
SPISOMI->MDR
SPISTE->MFSX
SPITXINT->
SPIRXINT->
3.McBSP如何开启clock stop mode以兼容SPI接口?
通过CLKSTP、CLKXP和CLKRP来配置时钟的极性和延时的SPI兼容模式
将F2812的McBSP配置成SPI主模式来读取AD芯片的转换数据,因为不需要对这个AD芯片进行配置,所以不需要发送数据给这个芯片,因此,我把MDRA接口配置成通用I/O口,来作为AD芯片的启动信号,因为有3个从设备,所以至少要有两个片选信号,将MFSRA和MFSXA配置成通用I/O口,作为片选信号,不知道这么做是否正确。。。
然后先将程序下载到内部RAM,进行调试,因为不需要对这个AD芯片进行配置,所以发送伪数据来启动数据传输,但是最后读取的数据不对。。。AD芯片是下降沿读取数据。下面是McBSP的配置情况:
McbspaRegs.SPCR2.bit.XRST = 0;
McbspaRegs.SPCR1.bit.RRST = 0;
McbspaRegs.SPCR2.bit.GRST = 0;
McbspaRegs.SPCR1.bit.CLKSTP = 0x03;
McbspaRegs.PCR.bit.CLKXP = 1;
McbspaRegs.PCR.bit.CLKRP = 1;
McbspaRegs.PCR.bit.SCLKME = 0;
McbspaRegs.PCR.bit.CLKXM = 1;
McbspaRegs.PCR.bit.FSXM = 1;
McbspaRegs.PCR.bit.FSRM = 1;
McbspaRegs.XCR2.bit.XDATDLY = 1;
McbspaRegs.RCR2.bit.RDATDLY = 1;
McbspaRegs.RCR1.bit.RWDLEN1 = 2;
McbspaRegs.XCR1.bit.XWDLEN1 = 2;
McbspaRegs.SRGR1.bit.CLKGDV = 0x0E;
McbspaRegs.SRGR2.bit.FSGM = 0;
McbspaRegs.SRGR2.bit.CLKSM= 1;
asm(" RPT #5 || NOP ");
McbspaRegs.SPCR2.bit.GRST = 1;
asm(" RPT #140 || NOP ");
McbspaRegs.SPCR2.bit.XRST = 1;
McbspaRegs.SPCR1.bit.RRST = 1;
asm(" RPT #140 || NOP ");
困扰很久了,哪位高人指导一下,不甚感激
Travel Zhou:
回复 mangui zhang:
我用的是F2812,如果我用通用I/O口来模拟SPI时序的话,可以准确地读出数据,但是用McBSP配置成SPI的模式来读的话,结果就不对,好郁闷啊