TI中文支持网
TI专业的中文技术问题搜集分享网站

CC3220SF SPI同时数据传输时出现问题

Other Parts Discussed in Thread:CC3220SF, SYSCONFIG

你好,我使用两块CC3220SF开发板进行SPI主从demo测试,在连续发送的情况下,用逻辑分析仪发现在每次传输间隔MISO这里会出现一次错误的跳变,并且MISO的数据是错误的。逻辑分析仪测得的如下所示:

Kevin Qiu1:

SDK版本是多少,例程是否修改过

,

user6458813:

修改过,原SDK是还需要额外的两根线,我在这里直接去掉这两根线:主机代码:SPI_Params_init(&spiParams);spiParams.frameFormat = SPI_POL0_PHA1;spiParams.mode = SPI_MASTER;spiParams.transferMode = SPI_MODE_BLOCKING;spiParams.dataSize = 8;spiParams.bitRate = 2000000;masterSpi = SPI_open(CONFIG_SPI_MASTER, &spiParams);i = 1024;//发送1m数据memset(masterTxBuffer, 0x55, 1024);memset(masterRxBuffer, 0x55, 1024);transaction.count = SPI_MSG_LENGTH;transaction.txBuf = (void *) masterTxBuffer;transaction.rxBuf = (void *) masterRxBuffer;while(i){transferOK = SPI_transfer(masterSpi, &transaction);i–;}
从机代码:SPI_Params_init(&Spi_Params);Spi_Params.transferMode=SPI_MODE_CALLBACK;Spi_Params.transferCallbackFxn=transferCompleteFxn;Spi_Params.mode=SPI_SLAVE;Spi_Params.dataSize=8;Spi_Params.frameFormat=SPI_POL0_PHA1;

Spi_handle = SPI_open(CONFIG_SPI_0,&Spi_Params);memset(g_ucTxBuff_a, 0x65, 1024);Spi_transaction_a.count = RESIZE;Spi_transaction_a.txBuf = (void *)g_ucTxBuff_a;Spi_transaction_a.rxBuf = (void *)g_ucRxBuff_a;
while(1)
{
Spi_transferOK=SPI_transfer(Spi_handle, &Spi_transaction_a);if(Spi_transferOK){
while(Spi_transaction_a.status != SPI_TRANSFER_COMPLETED);}
}

,

Kevin Qiu1:

改成了三线,用原例程正常吗?

,

user6458813:

你好,怎么设置成三线模式,因为我在sysconfig那里设置后发现无法运行。我的从机与主机都是修该这个地方,请问只需要设置这里重新编译就可以了吗?

,

Kevin Qiu1:

是的,修改后保存再重新编译就行

,

user6458813:

你好,我已经这么做了。很可惜,还是出现一样的错误。如果可以,请您修改一下你的测试代码,工作在4线模式,主机设置的spiParams.bitRate = 15000000;(15MHZ),并且需要一次发送1M数据,从机设置为在接收数据时向主机发送数据,并在每次接收成功包后计数,等这1M的数据(主机发送完后)打印出来。如果可以请使用逻辑分析仪看下数据。

,

user6458813:

我的代码如下,使用examples\rtos\CC3220SF_LAUNCHXL\drivers\spimaster spislave。修改其中的slaveThread masterThread函数如下:

#define SPI_MSG_LENGTH 1024

void *masterThread(void *arg0)
{SPI_HandlemasterSpi;SPI_ParamsspiParams;SPI_Transaction transaction;uint32_ti;booltransferOK;int32_tstatus;status = sem_init(&masterSem, 0, 0);if (status != 0) {Display_printf(display, 0, 0, "Error creating masterSem\n");
while(1);}SPI_Params_init(&spiParams);spiParams.frameFormat = SPI_POL0_PHA0;spiParams.mode = SPI_MASTER;spiParams.transferMode = SPI_MODE_BLOCKING;spiParams.transferTimeout = SPI_WAIT_FOREVER;spiParams.dataSize = 8;spiParams.bitRate = 15000000;masterSpi = SPI_open(CONFIG_SPI_MASTER, &spiParams);if (masterSpi == NULL) {Display_printf(display, 0, 0, "Error initializing master SPI\n");while (1);}else {Display_printf(display, 0, 0, "Master SPI initialized\n");}memset(masterTxBuffer, 0x55, SPI_MSG_LENGTH);memset(masterRxBuffer, 0x55, SPI_MSG_LENGTH);for(i = 1024;i>0;i–)
{transferOK = SPI_transfer(masterSpi, &transaction);
/*等待其传输完成*/if(transferOK){while(transaction.status != SPI_TRANSFER_COMPLETED );}else{Display_printf(display, 0, 0, "spi transfail\n\r ");}
}Display_printf(display, 0, 0, "transfer done\n\r");while(1);
}

从机的代码如下:
从机需要配置使用SW2注册为中断函数,当按下SW2就打印出计数的包:
void pushButtonInterruptHandler_SW3(uint_least8_t index)
{Display_printf(display, 0, 0, "包的个数 %d\n\r",asd);asd = 0;
}
void slaveThread(void)
{SPI_HandleslaveSpi;SPI_ParamsspiParams;SPI_Transaction transaction;uint32_ti;booltransferOK;freeze = 0xff;asd = 0;SPI_Params_init(&spiParams);spiParams.frameFormat = SPI_POL0_PHA0;spiParams.mode = SPI_SLAVE;spiParams.transferCallbackFxn = transferCompleteFxn;spiParams.transferMode = SPI_MODE_CALLBACK;slaveSpi = SPI_open(CONFIG_SPI_SLAVE, &spiParams);if (slaveSpi == NULL) {Display_printf(display, 0, 0, "Error initializing slave SPI\n");while (1);}else {Display_printf(display, 0, 0, "Slave SPI initialized\n");}GPIO_setCallback(CONFIG_GPIO_sw2, pushButtonInterruptHandler_SW3);GPIO_enableInt(CONFIG_GPIO_sw2);memset(masterTxBuffer, 0x55, SPI_MSG_LENGTH);memset(masterRxBuffer, 0x55, SPI_MSG_LENGTH);while(1){ memset((void *) masterRxBuffer, 0, SPI_MSG_LENGTH);transaction.count = SPI_MSG_LENGTH;transaction.txBuf = (void *) masterTxBuffer;transaction.rxBuf = (void *) masterRxBuffer;transferOK = SPI_transfer(slaveSpi, &transaction);if (transferOK) {while(transaction.status != SPI_TRANSFER_COMPLETED);asd++;}

}

赞(0)
未经允许不得转载:TI中文支持网 » CC3220SF SPI同时数据传输时出现问题
分享到: 更多 (0)