McBSP是多通道缓冲串行口,DM6437供给了McBSP0&McBSP1两个串行口,每个串行口有7个管脚,能够支撑多通道串行数据通讯。
MCBSP的内部框图:
这两个端口也支撑时钟中止形式,内部FSR与FSX、CLKX与CLKR衔接在一起,这时分DX为MOSI,,DR为MISO,CLKX为SCK和FSX为nSS。
装备SPI口要留意的当地:通讯形式选择要共同;SPI供给了四种通讯形式:SPI0、SPI1、SPI2、SPI3。
McBSP经过装备CLKSTP与CLKXP来设置这四种形式:
一般来说SPI0形式选用的多一些。
SPI初始化过程:
在这之前还有两个操作有必要完结,DM6437的管脚复用设置为McBSP形式、McBSP的IO上电。(能够直接写相关寄存器、或许调用CSL函数),管脚复用仅仅设置DSP芯片管脚的引出方法,McBSP会有一个特殊情况,需求检测第一个帧同步信号;这个时分就能够复用FSX脚为GPIO脚,用GPIO来检测信号的改变,因而咱们有理由信任不管用户选用装备出来是什么形状,内部这些脚其实是连在一起的。别的还声明一个误区:管脚复用和接口寄存器装备并没有联系,用户能够随时装备McBSP接口的相关寄存器,而不需求指定这些脚现已映射为McBSP管脚;当然仍是得满意IO上拉的条件。
DM6437 SPI Master Config
DM6437 SPI Slaver Config
编写程序能够依据CSL库供给的函数,或许看到TI针对DM6437不再供给CSL驱动了,而是供给PSP驱动;可是这话不肯定,TI仍是有DM6437可用的CSL库函数能够用,可是对我而言选用的是CSL供给的界说,自己编写函数;由于我找到了CSL支撑的寄存器数据结构,可是没有找到相应的CSL函数阐明,没有看到函数原型。
装备SPI口其实是很简单的,尽管我花费了太多的时刻,这个最终我会阐明,自己装备寄存器,能够很简单的直接给寄存器赋值,只需计算好该寄存器最终的值是什么直接赋值就能够了,可是需求留意复位脚设置什么的。。。该延时的要延时。这种寄存器装备一般来说没有什么先后顺序,没有什么要求;有要求的文档会有标示。假如不是一次性设定寄存器的值,那么在设置寄存器的时分一定要很当心取与取或的时分不要覆盖了前面的设置;这个由于我第一次是一位一位设置的,没有留意;到得到的和自己想要的完结是两回事。引荐一次性设置,当然可读性不就会这么好,可读性能够在程序跑通了再寻求。
PSP_103什么版别的,假如自己电脑上面正好有这个驱动,那么直接调用,那就能够很简单了,和填空差不多了。LLC供给了底层驱动的,这个部分和自己装备寄存器相同的道理,DDC为驱动核心层,供给了OS与底层的交互,也便是咱们常说的PSP驱动了;BIOS是上层体系层调用了。假如对PSP了解,那么能够自己决议程序写在哪一层,这个便是DM6437与DM642最大的不同。一般来说,我喜爱直接操作底层,从DM642养成的习气。
别的说一下SPI数据通讯的才能:
假如主设备选用内部时钟,则SPI内部时钟为CPU时钟/6,由于主设备和从设备要坚持同步,却又选用各自的时钟,所以有必要确保从设备具有同步才能,从设备的时钟有必要大于主设备时钟8倍,从设备一般默认设置到最大时钟才能、即CLKDVG=1。
别的数据的传输方法也会对数据通讯才能有很大引向,McBSP供给了三种方法:CPU查询形式、CPU中止形式、EDMA3形式。选用EDMA3形式能够获得最大的数据通讯才能,当然驱动编写就杂乱一些,假如选用PSP倒也罢了。
最终说一下在调试中遇到的问题:
1) 装备寄存器,一位一位装备,得到很意外的成果,最终一步一步盯梢才找到原因。
2) 依据文档装备SPI口,可是便是不能正常通讯。后来查找SPI协议,了解了SPI口相关常识,才知道CLKXP并不能随意装备
3) 装备好SPI口,左看右看程序没有问题,可是便是不能正常通讯,逐一检测管脚状况,发现DR脚,没有衔接时,都有波形输出,却是数据采样不对,换另一个端口,总算正常通讯了。
void SPI_Slave_Init ( unsigned long Bits )
{
unsigned long i;
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_FRST,RESET); //frame sync reset
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_XRST,DISABLE); //transmitter reset
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_RRST,DISABLE); //receiver reset
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_GRST,CLKG); //SRGR reset
//serial port control register SPCR
mcbsp0Regs->SPCR = CSL_FMKT(MCBSP_SPCR_CLKSTP,DELAY); //In SPI mode, data sampled on rising edge with delay
//pin control register
mcbsp0Regs->PCR = CSL_FMKT(MCBSP_PCR_FSXM,EXTERNAL) //external frame sync
| CSL_FMKT(MCBSP_PCR_CLKXM,INPUT) //trans clock mode
| CSL_FMKT(MCBSP_PCR_FSXP,ACTIVELOW); //active low
//sample rate generator SRGR
mcbsp0Regs->SRGR = CSL_FMKT(MCBSP_SRGR_CLKSM,INTERNAL) //internal clock
| CSL_FMK(MCBSP_SRGR_CLKGDV,1); //clock divider value
switch ( Bits )
{
case SPI_8BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,8BIT); //receive word 8bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,8BIT); //trans word 8bit
break;
case SPI_12BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,12BIT); //receive word 12bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,12BIT); //trans word 12bit
break;
case SPI_16BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,16BIT); //receive word 16bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,16BIT); //trans word 16bit
break;
case SPI_20BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,20BIT); //receive word 20bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,20BIT); //trans word 20bit
break;
case SPI_24BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,24BIT); //receive word 24bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,24BIT); //trans word 24bit
break;
case SPI_32BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,32BIT); //receive word 32bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,32BIT); //trans word 32bit
break;
default:;
}
//start the mcbsp running
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_GRST,CLKG); //SRGR out of reset
for ( i = 0; i < 200; i++ ) { i++; }
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_RRST,ENABLE); //receiver enable
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_XRST,ENABLE); //transmitter enable
for ( i = 0; i < 200; i++ ) { i++; }
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_FRST,FSG); //enable frame sync
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/262557.html