我在调试6727spi时遇到个现象,我写了个函数如下:
void W_CommandValue (Uint8 cmd, Uint8 value){
Uint8 flagStatus = 0;
CSL_Status status;
spi_ce(0x00000000);//片选
status = CSL_spiHwControl (hSpi, CSL_SPI_CMD_CPT_WRITE0, &cmd);
if (status != CSL_SOK) {
spi_error_exit ();
}
do {
CSL_spiGetHwStatus (hSpi, CSL_SPI_QUERY_EVT_STATUS,&flagStatus);
} while ((flagStatus & SPI_CHK_RX_MASK) != SPI_RX_FLG_SET);
status = CSL_spiHwControl (hSpi, CSL_SPI_CMD_CPT_WRITE0, &value);
if (status != CSL_SOK) {
spi_error_exit ();
}
do {
CSL_spiGetHwStatus (hSpi, CSL_SPI_QUERY_EVT_STATUS,&flagStatus);
} while ((flagStatus & SPI_CHK_RX_MASK) != SPI_RX_FLG_SET);
spi_ce(0x00000001);
}
spi配置为3pin模式,8bit数据模式。
void SPI1_INIT(void){
CSL_Status status;
/* Clear local data structures */
memset (&spiObj, 0, sizeof (CSL_SpiObj));
memset (&SpiHwSetup, 0, sizeof(CSL_SpiHwSetup));
memset (&spiPins, 0, sizeof (spiPins));
memset (&priFmt0, 0, sizeof (priFmt0));
/* Initialize SPI module */
status = CSL_spiInit (NULL);
if (status != CSL_SOK) {
printf ("SPI: Initialization... Failed.\n");
printf ("\tReason: CSL_spiInit failed. [status = 0x%x].\n", status);
return;
}
else {
printf ("SPI: Initialization... Passed.\n");
}
hSpi = CSL_spiOpen (&spiObj, CSL_SPI_1, NULL, &status);
if ((status != CSL_SOK) || (hSpi == NULL)) {
printf ("SPI: Opening instance... Failed.\n");
printf
("\tReason: Error opening the instance. [status = 0x%x, hSpi = 0x%x]\n",
status, hSpi);
return;
}
else {
printf ("SPI: Opening instance... Passed.\n");
}
/* Reset SPI */
status = CSL_spiHwControl (hSpi, CSL_SPI_CMD_PRI_RESET, NULL);//执行reset后,SPIGCR0.RESET = 1
if (status != CSL_SOK) {
printf ("SPI: CSL_spiHwControl - CSL_SPI_CMD_RESET... Failed.\n");
printf ("\tReason: Error while resetting SPI. [status = 0x%x]\n",
status);
spi_error_exit ();
return;
}
else {
printf ("SPI: CSL_spiHwControl - CSL_SPI_CMD_RESET... Passed.\n");
}
/* Set SIMO & SOMI to Functional Pins */
spiPins.func = SPI_PINCTRL_SPIFUNC_3PIN; //SPIPC0 = 0x00000e00
/* Intialize the SPI hardware setpu structure */
spiPri.fmt[0] = &priFmt0;
spiPri.fmt[1] = &priFmt1;
spiPri.fmt[2] = &priFmt2;
spiPri.fmt[3] = &priFmt3;
SpiHwSetup.genPtr = &spiGen;
SpiHwSetup.priPtr = &spiPri;
SpiHwSetup.cptPtr = &***;
SpiHwSetup.pinsPtr = &spiPins;
/* set SPI parameters to test loopback functionality */
/* Set SPI to Master mode */
SpiHwSetup.genPtr->opMode = CSL_SPI_OPMOD_MASTER; //SPIGCR1 = 0x00000003
SpiHwSetup.genPtr->c2tDelay =31;
SpiHwSetup.genPtr->t2cDelay =31;
/* set char lenth to 16 bit */
priFmt0.charLen = 0x08;//SPI_DATA_FMT_CHARLEN_8BIT;
/* set shift direction to MSB first */
priFmt0.shiftDir = CSL_SPI_SHDIR_MSBFIRST;
priFmt0.preScale = 7;
priFmt0.phase = CSL_SPI_PHASE_OUT; //1
priFmt0.polarity = CSL_SPI_POLARITY_INACTIVELO; //0
SpiHwSetup.genPtr->enaHiZ = CSL_SPI_ENAHIZ_YES; //SPIINT0 = 0x01000000(SPIx_ENA=Hi-Z)
status = CSL_spiHwSetup (hSpi, &SpiHwSetup);
if (status != CSL_SOK) {
printf ("SPI: HW Setup... Failed.\n");
printf ("\tReason: Error while SPI Hw Setup. [status = 0x%x]\n",
status);
spi_error_exit ();
return;
}
else {
printf ("SPI: HW Setup... Passed.\n");
}
/* Data Word 0 Selected (SPIFMT0is selected)*/
CSL_spiHwControl (hSpi, CSL_SPI_CMD_CPT_WRITE1, 0);
/* Reset SPI */
status = CSL_spiHwControl (hSpi, CSL_SPI_CMD_PRI_RESET, NULL);
if (status != CSL_SOK) {
printf ("SPI: CSL_spiHwControl - CSL_SPI_CMD_RESET... Failed.\n");
printf ("\tReason: Error while resetting SPI. [status = 0x%x]\n",
status);
spi_error_exit ();
return;
}
else {
printf ("SPI: Reset... Passed.\n");
}
/* enable SPI for Data transfer */
status = CSL_spiHwControl (hSpi, CSL_SPI_CMD_XFER_ENABLE, NULL);
if (status != CSL_SOK) {
printf ("SPI: CSL_spiHwControl - CSL_SPI_CMD_XFER_ENABLE... Failed.\n");
spi_error_exit ();
return;
}
else {
printf ("SPI: Transfer enable ... Passed.\n");
}
}
这个函数是要一次写两个字节cmd和value。每次进入这个函数只能正确发送cmd,但是第二个写操作发送的还是cmd的值,而非value的值。
这是为什么?
请工程师解答一下,谢谢