我将spi1设置为从模式dmax传输,当一旦使能spi dmax传输时就会将dmax的接收buf的第一个字节置零,这样导致每次开始传输数据时总是将要写的第一个字节写入了buf的第二个字节位置,请问一下这个是怎么回事??我的SPI初始化代码如下
void spi1_init(void)
{
unsigned int pinmsk;
DMAX_SPI1();
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPIGCR0) = 0x00;//reset spi1;
//SPI0_GCR0=0x00;//reset spi;
/* Chose the SPI pins to be configured as functional pins */
//pinmsk=0x0E00; /* SPI 3-pin mode */
pinmsk=0x0E01; /* SPI 4-pin with chip select mode */
//pinmsk=0x0F00; /* SPI 4-pin with enable mode */
//pinmsk=0x0F01; /* SPI 5-pin mode */
/* 1. Take the SPI1 out of reset */
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPIGCR0) = 0x01;
//SPI0_GCR0=0x01;
/* 2. Configure SPI1 for slave */
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPIGCR1) = 0x00;
//SPI0_GCR1=0x00;
/* 3. Configure SPI1 mode */
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPIPC0) = pinmsk;
//SPI0_PC0 =pinmsk;
/* 4. Chose SPI1 SPIFMT0 */
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPIDAT1) = 0x00000000;
//SPI0_DAT1=0x00000000;
/* 5. Configure SPI1 for SHIFTDIR=0,POLARITY=1,PHASE=0,
CHARLEN=8 8bit CHARLEN=10 16bit*/
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPIFMT0) = 0x00020008;
//SPI0_FMT0=0x00020010;
/* 6. SPIDELAY for SPI1 not relevant in slave mode */
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPIDELAY) = 0x00;
//SPI0_DELAY =0x00;
/* 7. Configure SPI1 for error notifications for OVR,BITERR and DESEL */
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPIINT0) = 0x00000000;
//SPI0_INT0 =0x00000000;
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPILVL) = 0x00;
//SPI0_LVL =0x00;
/* 8. Enable SPI1 communication */
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPIGCR1) = 0x01000000;
//SPI0_GCR1 |=0x01000000;
/* 9. Configure SPI1 for dmax servicing of spi events*/
*(volatile int *)(SPI_CONTREG_BASE_ADD1 + SPI_CONTREG_SPIINT0) = 0x00010000;//执行完这里后就会将rx_buf的第一个字节置零
//SPI0_INT0 |=0x00010000;
/* 10. Let dMAX handle SPI data transfer and interrupt service routine handle
SPI error cases */
/* Configure dMAX channel to service SPI data transfers */
/* Perform any other processing */
}
dmax_spi的初始化化代码如下:
void DMAX_SPI1(void)
{
//dMAX event low priority
*(volatile unsigned int*)(DMAX_CONTREG_BASE_ADD + DMAX_DEHPR)
= (0x1 << 14); //EHP14 set as a low-priority event for SPI1
//dMAX event polarity
*(volatile unsigned int*)(DMAX_CONTREG_BASE_ADD + DMAX_DEPR)
= (0x1 << 14); //event flag is set on rising edge
/********************* SPI1 RX EVENT ENTRY *****************************/
//event entry(event #14 entry) SPI1 RX DMA REQ
*(volatile unsigned int*)(DMAX_HiMAX_EVENT_ENTRYADD + 0x38)
= 0x02 //ETYPE set to "00010" ,as a SPI RX transfer event.
|(0x01 << 5) //RELOAD=1;
|(0x01 << 6) //ESIZE = 01,8-bit element
//|(0x02 << 6) //ESIZE = 10,16-bit element
|(0x1A8 << 8) //PTE = 110101011, pointer to transfer entry #6
|(0x06 << 24) //TCC = 0110;TCC6
|(0x01 << 28) //TCINT = 0 ;After completing a whole transfer, the dMAX controller sets a TCC pending bit. If the bit in the
// DTCR register was previously cleared, it triggers an interrupt to the CPU.
|(0x01 << 29); //SPI = 1 ;SPI1
/********************* SPI0 RX TRANSFER ENTRY *****************************/
//transfer entry #6 (event #14 entry) SPI1 RX DMA REQ//
*(volatile unsigned int*)(DMAX_HiMAX_TRANSFER_ENTRYADD + 0x108 + 0x00)
= (unsigned int)(&tx_buf); //tx src
*(volatile unsigned int*)(DMAX_HiMAX_TRANSFER_ENTRYADD + 0x108 + 0x04)
= (unsigned int)(&rx_buf); //rx dst
*(volatile unsigned int*)(DMAX_HiMAX_TRANSFER_ENTRYADD + 0x108 + 0x08)
= RX_LENGHT //COUNT ACTIVE = 1
|(0x00 << 31); //PP = 0
*(volatile unsigned int*)(DMAX_HiMAX_TRANSFER_ENTRYADD + 0x108 + 0x0c)
= RX_LENGHT; //COUNT REFERENCE= 1
*(volatile unsigned int*)(DMAX_HiMAX_TRANSFER_ENTRYADD + 0x108 + 0x10)
= (unsigned int)(&tx_buf); //SRC0 = 1
*(volatile unsigned int*)(DMAX_HiMAX_TRANSFER_ENTRYADD + 0x108 + 0x14)
= (unsigned int)(&rx_buf); //DST0 = 1
*(volatile unsigned int*)(DMAX_HiMAX_TRANSFER_ENTRYADD + 0x108 + 0x18)
= (unsigned int)(&tx_buf); //SRC1 = 1
*(volatile unsigned int*)(DMAX_HiMAX_TRANSFER_ENTRYADD + 0x108 + 0x1c)
= (unsigned int)(&rx_buf); //DST1 = 1
*(volatile unsigned int*)(DMAX_CONTREG_BASE_ADD + DMAX_DEER )
= (0x01 << 14); //event 14 is enable
}