在项目中用到了DSP的mcbsp复用成SPI功能,网上相关代码较少,CSDN部分资源付费,现将部分代码附上,包含MCP23S09驱动
void Drv_Mcbsp_Init(void)
{
// 1. 配置MCBSP的GPIO引脚
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 3; // MDXB引脚
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 3; // MDRB引脚
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 3; // CLKX引脚
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0; // FSX引脚
GpioCtrlRegs.GPADIR.bit.GPIO12 = 1; // MDXB引脚输出
GpioCtrlRegs.GPADIR.bit.GPIO13 = 0; // MDRB引脚输入
GpioCtrlRegs.GPADIR.bit.GPIO14 = 1; // CLKX引脚输出
GpioCtrlRegs.GPADIR.bit.GPIO15 = 1; // FSX引脚输出
McbspbRegs.SPCR2.all=0x0000; // Reset FS generator, sample rate generator & transmitter
McbspbRegs.SPCR1.all=0x0000; // Reset Receiver, Right justify word, Digital loopback dis.
McbspbRegs.MFFINT.all=0x0; // Disable all interrupts
McbspbRegs.PCR.bit.FSXM = 1; //FSX generated internally, FSR derived from an external source
McbspbRegs.PCR.bit.CLKXM = 1; //CLKX generated internally, CLKR derived from an external source
McbspbRegs.PCR.bit.FSRM = 1;
McbspbRegs.PCR.bit.CLKRM = 1;
McbspbRegs.PCR.bit.SCLKME=0;
McbspbRegs.PCR.bit.FSXP=1;
McbspbRegs.PCR.bit.CLKXP=0;
McbspbRegs.PCR.bit.CLKRP=1;
McbspbRegs.SPCR1.bit.CLKSTP = 3;
McbspbRegs.RCR2.all=0x0; // Single-phase frame, 1 word/frame, No companding (Receive)
McbspbRegs.RCR1.all=0x0;
McbspbRegs.XCR2.all=0x0; // Single-phase frame, 1 word/frame, No companding (Transmit)
McbspbRegs.XCR1.all=0x0;
McbspbRegs.XCR2.bit.XDATDLY=1;
McbspbRegs.RCR2.bit.RDATDLY=1;
McbspbRegs.SRGR2.all=0x2000; // CLKSM=1, FPER = 1 CLKG periods
McbspbRegs.SRGR1.all= 0x001D; // Frame Width = 1 CLKG period, CLKGDV=29
McbspbRegs.SPCR2.bit.GRST=1; // Enable the sample rate generator
DELAY_US(2); // Wait at least 2 SRG clock cycles
McbspbRegs.RCR1.bit.RWDLEN1=0; // 8-bit word
McbspbRegs.XCR1.bit.XWDLEN1=0; // 8-bit word
McbspbRegs.SPCR2.bit.XRST=1; // Release TX from Reset
McbspbRegs.SPCR1.bit.RRST=1; // Release RX from Reset
McbspbRegs.SPCR2.bit.FRST=1; // Frame Sync Generator reset
EDIS;
}
编辑器为CCSv7 在mcbsp发送时数据放于寄存器低八位,如下代码所示,0xf0为测试用
BOOL Mcbsp_Write(BOOL data)
{
McbspbRegs.DXR1.bit.LWHB=0xF0;
McbspbRegs.DXR1.bit.LWLB=data;
while(McbspbRegs.SPCR2.bit.XRDY==0);
while(McbspbRegs.SPCR1.bit.RRDY==0);
BOOL res = McbspbRegs.DRR1.bit.LWLB;
return res;
}
void MCP23S09_Write(BOOL regAddr, BOOL data)
{
GpioDataRegs.GPADAT.bit.GPIO15=0;
Mcbsp_Write(0x40);
Mcbsp_Write(regAddr);
Mcbsp_Write(data);
GpioDataRegs.GPADAT.bit.GPIO15=1;
}
BOOL MCP23S09_Read(BOOL regAddr)
{
BOOL data=0;
GpioDataRegs.GPADAT.bit.GPIO15=0;
Mcbsp_Write(0x41);//读指令
Mcbsp_Write(regAddr);
data = Mcbsp_Write(0xff);
GpioDataRegs.GPADAT.bit.GPIO15=1;
return data;
}
BOOL MCP23S09_Init(BOOL data)
{
BOOL res =0;
MCP23S09_Write(0x05,0x20);//按字节写
MCP23S09_Write(0x00,0x00);//配置为输出模式
MCP23S09_Write(0x06,0xFF);//配置为上拉
MCP23S09_Write(0x0A,data);//写入测试数据
res = MCP23S09_Read(0x09);//读取测试数据
if(res == data)
return TRUE;
else
return FALSE;
}
希望可以帮助到你