本人邮箱:jcljob@126.com 欢迎交流或者留言,转载请注明来源,谢谢。
之前写过一个dsp驱动w5200以太网的驱动,分别用到如题的两种方式,网上很多例子不够完善,这里给出详细代码。
下面简单介绍下配置要点和收发等情况;
spi的引脚控制主要用到
SPISOMI: 主入从出
SPISIMO:主出从入
SPICLK:时钟
第一种方式:mcbsp配置成spi
—————————————————–mcbsp—————————————————————————————-
void LAN1_Gpio(void)
{
//mcbspb 做spi,
EALLOW
GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0
GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0
GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3
GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3
GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3
//下面的值是3
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3
//Configure GPIO49 as RESET
GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0
GpioDataRegs.GPBSET.bit.GPIO49 = 1
GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 0
GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1
//Configure GPIO27 as SPISTEA
GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0
GpioDataRegs.GPASET.bit.GPIO27 = 1
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0
GpioCtrlRegs.GPADIR.bit.GPIO27 = 1
EDIS
}
#define RD =1;//编译控制字根据自己的芯片进行选择
void LAN1_Init()
{
// McBSP register settings
McbspbRegs.SPCR2.all=0x0000
McbspbRegs.SPCR1.all=0x0000
McbspbRegs.PCR.all=0x0F08
McbspbRegs.SPCR1.bit.DLB = 0
McbspbRegs.PCR.bit.CLKXM = 1
McbspbRegs.PCR.bit.CLKRM = 1
McbspbRegs.PCR.bit.SCLKME = 0
McbspbRegs.SRGR2.bit.CLKSM = 1
McbspbRegs.SRGR2.bit.FPER = 1
McbspbRegs.PCR.bit.FSRM = 1
McbspbRegs.SRGR1.bit.CLKGDV = 1
McbspbRegs.SRGR1.bit.FWID = 0
#if RND
McbspbRegs.SPCR1.bit.CLKSTP = 2
McbspbRegs.PCR.bit.CLKXP = 0
McbspbRegs.PCR.bit.CLKRP = 0
#endif
#if RD
McbspbRegs.SPCR1.bit.CLKSTP = 3
McbspbRegs.PCR.bit.CLKXP = 0
McbspbRegs.PCR.bit.CLKRP = 1
#endif
#if FND
McbspbRegs.SPCR1.bit.CLKSTP = 2
McbspbRegs.PCR.bit.CLKXP = 1
McbspbRegs.PCR.bit.CLKRP = 0
#endif
#if FD
McbspbRegs.SPCR1.bit.CLKSTP = 3
McbspbRegs.PCR.bit.CLKXP = 1
McbspbRegs.PCR.bit.CLKRP = 1
#endif
McbspbRegs.RCR2.all=0x0001
McbspbRegs.RCR1.all=0x0000
McbspbRegs.XCR2.all=0x0001
McbspbRegs.XCR1.all=0x0000
McbspbRegs.SRGR2.all=0x2000
McbspbRegs.SRGR1.all=0x000F
McbspbRegs.SPCR1.bit.DXENA=1
McbspbRegs.SPCR2.bit.XINTM = 0
McbspbRegs.SPCR1.bit.RINTM = 0
McbspbRegs.MFFINT.bit.RINT = 0
McbspbRegs.XCR2.bit.XDATDLY = 1
McbspbRegs.RCR2.bit.RDATDLY = 1
McbspbRegs.RCR1.bit.RWDLEN1=0
McbspbRegs.XCR1.bit.XWDLEN1=0
delay_loop()
McbspbRegs.SPCR2.all |=0x00C1
McbspbRegs.SPCR2.bit.FRST=1
McbspbRegs.SPCR2.bit.XRST=1
McbspbRegs.SPCR1.bit.RRST=1
}
注意:spi虽然配置为8bit收发,但是dsp是16位收发,而且dsp在发数据时候是高位数据有效,收数据是低位数据有效。
第二种方式:自带的spi配置
—————————————————–dsp自带的spi配置————————————————————
void LAN2_Gpio(void)
{
EALLOW
GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0
GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0
GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0
GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3
GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3
GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3
GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3
GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1
GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1
GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1
//Configure GPIO53 as RESET
GpioCtrlRegs.GPBPUD.bit.GPIO53 = 0
GpioDataRegs.GPBSET.bit.GPIO53 = 1
GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0
GpioCtrlRegs.GPBDIR.bit.GPIO53 = 1
//Configure GPIO57 as SPISTEA
GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0
GpioDataRegs.GPBSET.bit.GPIO57 = 1
GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0
GpioCtrlRegs.GPBDIR.bit.GPIO57 = 1
EDIS
}
void LAN2_Init()
{
SpiaRegs.SPICCR.all =0x0007
SpiaRegs.SPICTL.all =0x000e
//enable talk, and SPI int disabled.
SpiaRegs.SPIBRR =0x0063
SpiaRegs.SPISTS.all=0x0000
SpiaRegs.SPICCR.all =0x0087
SpiaRegs.SPIPRI.bit.FREE = 0x0001
SpiaRegs.SPICCR.bit.SPISWRESET=1
}
两种模式的收发也是不一样的,稍注意下。
各种细节都在代码里了,根据要驱动的芯片进行改动即可,如果是w5500、w5200等以太网芯片,直接可用。
关于驱动dsp驱动12864等,主要是控制上电时序,引脚电平,配置spi。细节不再多讲。