目前在调试cc1310作为spi从机的功能 主机用的stm32 目前从机可以接收到主机的数据(随机字符串) 但是主机接收不到从机的数据
spi用的SPI_POL0_PHA1模式 ,stm32做主机时,在通信过程中片选信号我一直拉低,芯片手册也是这么要求的,stm32时钟设置为空闲时钟低电平,第二个时钟沿进行数据采样,也就是下降沿,这应该是也符合cc1310SPI_POL0_PHA1模式下的要求。主机spi传输速度我也是设置的最低。
目前找不到主机接收不到cc1310数据的原因? 有过类似经历或者大神给点意见吗?
debuge时也发现了一个问题,上图中鼠标标注的代码(蓝色的那行) object->currentTransaction->count等于8 ,object->amtDataXferred=0,MAX_DMA_TRANSFER_AMOUNT=1024;所以正常应该执行else中程序,但是debuge时走的if里的程序,这是什么原因啊?
而且下面434行的移位操作也不正常 8<<0 8左移0位得到了-1 ????
在SPICC26XXDMA.c这个文件中的代码,有时候也不按照顺序执行,总有正在执行下面代码的时候,下一步就跳到上面代码的情况???
TI大哥救救孩子吧!要被逼疯了,对了我用的CCS调试
Alvin Chen:
你有逻辑分析仪吗?
SPI_POL0_PHA1模式的时候,默认片选管脚SSln_FSS一直保持低电平就可以了。
SPI_Params_init(&spiParams);spiParams.frameFormat = SPI_POL0_PHA1;spiParams.mode = SPI_SLAVE;spiParams.transferCallbackFxn = transferCompleteFxn;spiParams.transferMode = SPI_MODE_CALLBACK;slaveSpi = SPI_open(Board_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");}/* Copy message to transmit buffer */strncpy((char *) slaveTxBuffer, SLAVE_MSG, SPI_MSG_LENGTH);for (i = 0; i < MAX_LOOP; i++) {/* Initialize slave SPI transaction structure */slaveTxBuffer[sizeof(SLAVE_MSG) - 1] = (i % 10) + '0';memset((void *) slaveRxBuffer, 0, SPI_MSG_LENGTH);transaction.count = SPI_MSG_LENGTH;transaction.txBuf = (void *) slaveTxBuffer;transaction.rxBuf = (void *) slaveRxBuffer;transferOK = SPI_transfer(slaveSpi, &transaction);if (transferOK) {}else {Display_printf(display, 0, 0, "Unsuccessful slave SPI transfer");}/* Sleep for a bit before starting the next SPI transfer*/sleep(3);}SPI_close(slaveSpi);上面的程序至少我测下来没有问题.
同时也找其他同事帮你看一下,你可以先去测试,等我一下我同事的回复。
user5863069:
回复 Alvin Chen:
感谢你的回复,我身边并没有逻辑分析仪 ,上述我提到的主机时钟,我设置也没有什么问题吧?我能想到的我都尝试过了,但是主机stm32还是不能接收到数据,很困惑问题出在了哪里?
Alvin Chen:
回复 user5863069:
你这个问题我之前已经回复过的,你示波器有的吧,当你CC1310的SPI传输出去,至于你STM32怎么接收的就不清楚了。
你手里有2个CC1310吗,你可以两个CC1310 一个master 一个slave 对测。
user5863069:
回复 Alvin Chen:
好的我尝试一下两个1310测试一下那我上面的贴出的程序中代码并不是顺序执行是什么原因呢?
user5863069:
回复 Alvin Chen:
你好我尝试了两个cc1310是可以正常通信的但是我发现一个问题就是1310sdk里的slave 例程用的Board_SPI_SLAVE 是三线spi对吗好像没有用到片选信号呀? 而且我用stm32和cc1310通信 不使用片选信号的话,1310也是可以收到数据的,就是发出的数据,主机接收不到
Alvin Chen:
回复 user5863069:
这要看你的STM32是否需要一个片选信号,如果需要你需要手动控制一个IO。
CC1310_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,/* LED initially off*/CC1310_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,/* LED initially off*/CC1310_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,/* Button is active low*/CC1310_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,/* Button is active low*/CC1310_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,/* External flash chip select */CC1310_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,/* UART RX via debugger back channel */CC1310_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,/* UART TX via debugger back channel */CC1310_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,/* SPI master out – slave in */CC1310_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,/* SPI master in – slave out */CC1310_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,请看上面的pin map
如果你想增加片选就需要仿照
CC1310_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,/* External flash chip
去注册一下
user5863069:
回复 Alvin Chen:
感谢回复!那这个需要在哪个文件中配置呢直接在CC1310_LAUNCHXL.h文件中通过/* SPI */
#define CC1310_LAUNCHXL_SPI_FLASH_CSIOID_20这样定义可以吗
Alvin Chen:
回复 user5863069:
IOID_20已经被使用了,却决于你自己想要用什么IO,IO也要进行初始化。
你去定义一个CC1310_LAUNCHXL_SPI0_CSN定义一个没有使用IO.
user5863069:
回复 Alvin Chen:
好的 多谢