I am programming on using SPI function, the master device is DM368 chip and slave is DM6437.
I configured the SPI word length as 8bit and set CLKGDV = 1.
The master device sends the bytes from 0x01 to 0x03 by a for loop.
The received result of DM6437(slave) is correct if master's data rate 1 Mbit / Sec.
The DM6437 on the input data is strange. A byte of data is coming, but The DM368 has three bytes(0x01, 0x02, 0x3) of data output.
In addition, the data are coming in different values.
My SPI initial function :
void DM6437_SPI_Slave_Init( )
{
Uint32 j, tmp, spcr, srgr, mcr, xcr, rcr, pcr;
spcr = 0x00000000u; //mcbsp0ModuleRegs->SPCR = 0x00000000u;
mcr = 0x00000000u; //mcbsp0ModuleRegs->MCR = 0x00000000u;
xcr = 0x00000000u;
rcr = 0x00000000u;
srgr = 0x00000000u;
pcr = 0x00000000u;
pcr = pcr | (CSL_MCBSP_PCR_CLKXM_MASK)
| (CSL_MCBSP_PCR_CLKXP_FALLING << CSL_MCBSP_PCR_CLKXP_SHIFT)
| (CSL_MCBSP_PCR_CLKRP_FALLING << CSL_MCBSP_PCR_CLKRP_SHIFT)
| (CSL_MCBSP_PCR_FSXP_MASK)
| (CSL_MCBSP_PCR_FSRP_MASK);
rcr = rcr | (0u << CSL_MCBSP_RCR_RDATDLY_SHIFT)
| (0u << CSL_MCBSP_RCR_RFRLEN1_SHIFT)
| (CSL_MCBSP_RCR_RCOMPAND_8BITLSB << CSL_MCBSP_RCR_RCOMPAND_SHIFT)
| (CSL_MCBSP_RCR_RWDLEN1_8BIT << CSL_MCBSP_RCR_RWDLEN1_SHIFT);
xcr = xcr | (0u << CSL_MCBSP_XCR_XDATDLY_SHIFT)
| (0u << CSL_MCBSP_XCR_XFRLEN1_SHIFT)
| (CSL_MCBSP_XCR_XCOMPAND_8BITLSB << CSL_MCBSP_XCR_XCOMPAND_SHIFT)
| (CSL_MCBSP_XCR_XWDLEN1_8BIT << CSL_MCBSP_XCR_XWDLEN1_SHIFT);
srgr = srgr | (CSL_MCBSP_SRGR_GSYNC_FREE << CSL_MCBSP_SRGR_GSYNC_SHIFT)
| (CSL_MCBSP_SRGR_CLKSP_FALLING << CSL_MCBSP_SRGR_CLKSP_SHIFT)
| (CSL_MCBSP_SRGR_CLKSM_INTERNAL << CSL_MCBSP_SRGR_CLKSM_SHIFT)
| (0x01u << CSL_MCBSP_SRGR_CLKGDV_SHIFT);
spcr = (spcr & (~CSL_MCBSP_SPCR_CLKSTP_MASK)
& (~CSL_MCBSP_SPCR_XRST_MASK)
& (~CSL_MCBSP_SPCR_RRST_MASK));
MCBSP0_MCR = mcr;
MCBSP0_PCR = pcr;
MCBSP0_XCR = xcr;
MCBSP0_RCR = rcr;
MCBSP0_SRGR = srgr;
MCBSP0_SPCR = spcr;
//setup pin muxing in order to view signals on pins
tmp = sysModuleRegs->PINMUX1 & (~CSL_SYS_PINMUX1_SPBK0_MASK);
tmp |= (1u << CSL_SYS_PINMUX1_SPBK0_SHIFT);
SYS_PINMUX1 = tmp;
//Wait two CLKSRG clocks. This is to ensure proper synchronization internally.
asm("\tnop 5");
MCBSP0_SPCR = (MCBSP0_SPCR & (~CSL_MCBSP_SPCR_CLKSTP_MASK))
| (CSL_MCBSP_SPCR_CLKSTP_NODELAY << CSL_MCBSP_SPCR_CLKSTP_SHIFT);
MCBSP0_SPCR |= CSL_MCBSP_SPCR_FREE_MASK;
for(j=0;j<20;++j) { }
MCBSP0_SPCR |= CSL_MCBSP_SPCR_GRST_MASK;
for(j=0;j<20;++j) { }
MCBSP0_SPCR |= CSL_MCBSP_SPCR_FRST_MASK;
for(j=0;j<20;++j) { }
MCBSP0_SPCR |= CSL_MCBSP_SPCR_RRST_MASK;
for(j=0;j<20;++j){ }
MCBSP0_SPCR |= CSL_MCBSP_SPCR_XRST_MASK;
for(j=0;j<20;++j){ }
asm("\tnop 5");
}
unsigned long SPIReceive()
{
int i;
unsigned long Recv;
for (i=0; i<3; i++)
{
// poll receiver is ready
while(CSL_FEXT(mcbsp0ModuleRegs->SPCR, MCBSP_SPCR_RRDY)
!= CSL_MCBSP_SPCR_RRDY_YES);
// read receive register
Recv = mcbsp0ModuleRegs->DRR;
LOG_printf(&trace, "receive data = 0x%08x ", Recv);
}
return (Recv);
}
The Connection of the hardware was done as follows.
DM365 DM6437
SPI_MISO ------------- AXR0[1]/DX0/GP[104]
SPI_SIMO ------------- AFSR0/DR0/GP[100]
SPI_SCLK ------------ ACLKR0/CLKX0/GP[99]
SPI_CS0 ------------- AXR0[2]/FSX0/GP[103]
The following figure the value of output from dm368 output on an oscilloscope, and that will be captured.
Yellow - SPI_MISO
Green - SPI_SIMO
Blue - SPI_SCLK
Red - SPI_CS0