完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
当我使用CC2640的SPI发送数据时,发现每发送一个字节,SPI的片选线就会出现一次上升沿。但是我传输的每一帧,都包含多个字节,这就导致SPI的片选线出现多个上升沿。如何配置SPI的片选线,使其能够在低电平时传输多个字节?
1、我的SPI的配置,CC2640配置为master模式。我的全部代码可从附件中下载。 (1)SPI的管脚配置 #define CC2640R2_LAUNCHXL_SPI0_MISO IOID_6 /* RF1.20 */#define CC2640R2_LAUNCHXL_SPI0_MOSI IOID_7 /* RF1.18 */#define CC2640R2_LAUNCHXL_SPI0_CLK IOID_10 /* RF1.16 */#define CC2640R2_LAUNCHXL_SPI0_CSN IOID_20 //PIN_UNASSIGNEDconst PIN_Config BoardGpioInitTable[] = [ CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */ CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */ //CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN, /* External flash chip select */ CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN, /* UART RX via debugger back channel */ /*-----当不使用UART时,应该将UART TX拉低,避免漏电 -----*/ CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL, /*CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL,*/ /* UART TX via debugger back channel */ CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master out - slave in */ CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master in - slave out */ CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI clock */ CC2640R2_LAUNCHXL_SPI0_CSN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN, /*-----这里的配置是多余的,在ccfg.c中配置bootloader back door就足够 -----*/ /*BOOTLOADER_BACKDOOR | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH,*/ PIN_TERMINATE]; (2)SPI的函数配置 SPI_Handle handle;SPI_Params params;uint8_t txBuffer[] = [ 0x5A ,0x5A ,0xA5 ,0xA5 ,0x01 ,0xFF ,0x00 ,0x16 ,0x33 ,0x44 , 0x55 ,0x66 ,0x33 ,0x44 ,0x55 ,0x66 ,0x33 ,0x44 ,0x55 ,0x66 , 0x33 ,0x44 ,0x55 ,0x66 ,0x33 ,0x44 ,0x55 ,0x66 ,0x33 ,0x44 , 0x00 ,0xDB];static void Spi_task_init(void)[ SPI_init(); // Initialize the SPI driver // Init SPI and specify non-default parameters SPI_Params_init(¶ms); params.bitRate = 1000000; params.dataSize = 8; // 8-bit data size params.frameFormat = SPI_POL0_PHA0; params.mode = SPI_MASTER; params.transferMode= SPI_MODE_BLOCKING; // Configure the transaction transaction.count = sizeof(signature); transaction.txBuf = (void *)signature; transaction.rxBuf = NULL; // Open the SPI and perform the transfer handle = SPI_open(Board_SPI0, ¶ms);]uint8_t SPI_transfer_frame_write(SPI_Handle handle, SPI_Transaction *transaction,uint8_t *buffer, size_t size)[ uint8_t uint8t_ret = 0; bool bool_ret = true; transaction->count = size; transaction->txBuf = buffer; transaction->rxBuf = NULL; bool_ret = SPI_transfer(handle, transaction); if(bool_ret == true) [ uint8t_ret = 1; ] else [ uint8t_ret = 0; ] return uint8t_ret;]static void Spi_taskFxn(UArg a0, UArg a1)[ Spi_task_init(); SPI_transfer_frame_write(handle, &transaction,txBuffer, 32);] 2、我传输一帧数据的波形图,如图1所示。每一个字节对应一个上升沿。 图1 3、我想实现的波形图,如图2所示。每一帧数据对应一个上升沿。 图2 4、附件 (1)SPI MASTER的源代码可在这里下载: source_code.rar (3)simplelink_cc2640r2_sdk_1_40_00_45 可从如下路径下载: (4)CC2640R2 launchpad 可从这里购买: 5、我的开发环境 CCS:Code Composer Studio 7.2.0 SDK:simplelink_cc2640r2_sdk_1_40_00_45 hardware:CC26640R2 launchpad develop kit VS: Microsoft Visual C++ 2010 Express 系统:win7 64 位 |
|
相关推荐
14 个讨论
|
|
Hi Heng,
这个时候你需要在代码里面自己去控制SPI的CS引脚。 要实现自己控制,你需要: 1. 在你的代码里面我看到CSN引脚是定义为IOID_20. 你需要把它改成PIN_UNASSIGNED。在这个配置下这个CSN引脚就会一直为低。 2.在你的APP层代码里面自己初始化IOID_20, 打开这个PIN得到这个PIN的handle,然后从APP层自己控制它。比如: 定义: static PIN_Config BoardCSPinTable[] = [ Board_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MIN, PIN_TERMINATE ]; 初始化: hCSPin = PIN_open(&pinCSState, BoardCSPinTable); if (hCSPin == NULL) [ return false; ] 调用: PIN_setOutputValue(hCSPin,Board_CS,Board_FLASH_CS_ON); Best Regards, Barbara |
|
|
|
|
|
非常感谢你的建议! 但是按照你的建议,无法发送数据。请问还有没有别的办法? 1、根据你的建议做的代码的修改 (1)更改IO口的配置 #define CC2640R2_LAUNCHXL_SPI0_MISO IOID_6 /* RF1.20 */#define CC2640R2_LAUNCHXL_SPI0_MOSI IOID_7 /* RF1.18 */#define CC2640R2_LAUNCHXL_SPI0_CLK IOID_10 /* RF1.16 */#define CC2640R2_LAUNCHXL_SPI0_CSN PIN_UNASSIGNED//IOID_20#define CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL IOID_20 (2)在spi_task.c中添加IO口的调用函数 #include (3)在SPI发送函数中,添加片选信号的拉低和拉高 uint8_t SPI_transfer_frame_write(PIN_Handle pin_handle,SPI_Handle handle, SPI_Transaction *transaction,uint8_t *buffer, size_t size)[ uint8_t uint8t_ret = 0; bool bool_ret = true; transaction->count = size; transaction->txBuf = buffer; transaction->rxBuf = NULL; PIN_setOutputValue(pin_handle, CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL, 0); delay_us(1); bool_ret = SPI_transfer(handle, transaction); if(bool_ret == true) [ uint8t_ret = 1; ] else [ uint8t_ret = 0; ] PIN_setOutputValue(pin_handle, CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL, 1); delay_us(1); return uint8t_ret;]static void Spi_taskFxn(UArg a0, UArg a1)[ Spi_task_init(); //SPI_transfer_frame_write(handle, &transaction,txBuffer, 32); SPI_transfer_frame_write(hPins,handle, &transaction,signature, 51);] 2、运行程序后,发现CC2640无法发送数据。如图1所示。发送失败的原因是片选信号拉低之后,CLK依旧保持高电平。 3、调整片选信号拉低和拉高后的延时时间,无论使用delay_us(1)还是delay_us(2),都会发送失败 请问还有没有别的方法? |
|
|
|
|
|
Hi Heng, 这个方法是我验证过的方法,我使用这个方法和外部SPI slave设备通信成功。 我看到你的CC2640是做SPI master。所以clock应该是从CC2640出的。这个PIN脚的修改应该不会影响到clock PIN脚的表现, 在代码里面,整个流程应该是没有什么问题。 唯一就是在操作CS PIN脚之后,你调用了delay_us(1) 函数。 这个函数不需要调用的,麻烦你把这个去掉试一下。 Best Regards, Barbara |
|
|
|
|
|
合肥冉坤 发表于 2019-10-30 16:32 问题已经解决。 解决方法就是删除Spi_task_init(void)函数中的PIN_init(SPI_CSN_PinTable),同时删除delay_us()函数 1、由于PIN_init()函数的调用时间是“Must be called early in the boot sequence to ensure that I/O pins have safe configurations.”,如图1所示,因此我不可以在Spi_task_init(void)函数中调用PIN_init(SPI_CSN_PinTable)。只需要调用PIN_open(&SPI_CSN_PinState, SPI_CSN_PinTable)即可。 2、删除PIN_init(SPI_CSN_PinTable)后,Spi_task_init(void)的正确写法如下 static void Spi_task_init(void)[ SPI_init(); // Initialize the SPI driver // Init SPI and specify non-default parameters SPI_Params_init(¶ms); params.bitRate = 1000000; params.dataSize = 8; // 8-bit data size params.frameFormat = SPI_POL0_PHA0; params.mode = SPI_MASTER; params.transferMode= SPI_MODE_BLOCKING; // Configure the transaction transaction.count = sizeof(signature); transaction.txBuf = (void *)signature; transaction.rxBuf = NULL; transaction.arg = NULL; // Open the SPI and perform the transfer handle = SPI_open(Board_SPI0, ¶ms); hPins = PIN_open(&SPI_CSN_PinState, SPI_CSN_PinTable); interrupt_event_init(); mcu_msg_fifo_init();] 3、删除delay_us()函数。SPI_transfer_frame_write()的正确写法如下 uint8_t SPI_transfer_frame_write(PIN_Handle pin_handle,SPI_Handle handle,SPI_Transaction *transaction,uint8_t *buffer, size_t size)[ uint8_t uint8t_ret = 0; bool bool_ret = true; transaction->count = size; transaction->txBuf = buffer; transaction->rxBuf = NULL; PIN_setOutputValue(pin_handle, CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL, 0); bool_ret = SPI_transfer(handle, transaction); if(bool_ret == true) [ uint8t_ret = 1; ] else [ uint8t_ret = 0; ] PIN_setOutputValue(pin_handle, CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL, 1); return uint8t_ret;] 4、逻辑分析仪的截图如图2所示 |
|
|
|
|
|
重新配置CC2640R2_LAUNCHXL_SPI0_CSN,将其配置为输入模式,SPI通信依旧失败。
CC2640R2_LAUNCHXL_SPI0_CSN的配置代码如下所示: const PIN_Config BoardGpioInitTable[] = [ CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */ CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */ //CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN, /* External flash chip select */ CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN, /* UART RX via debugger back channel */ /*-----当不使用UART时,应该将UART TX拉低,避免漏电 -----*/ CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL, /*CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL,*/ /* UART TX via debugger back channel */ CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master out - slave in */ CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master in - slave out */ CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI clock */ CC2640R2_LAUNCHXL_SPI0_CSN | PIN_BM_INPUT_EN | PIN_PULLDOWN, /*-----这里的配置是多余的,在ccfg.c中配置bootloader back door就足够 -----*/ /*BOOTLOADER_BACKDOOR | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH,*/ PIN_TERMINATE]; |
|
|
|
|
|
60user49 发表于 2019-10-30 17:15 将MISO和CSN管脚都更改后,依旧通信失败。slave节点还是只能接收到第一个字节。代码配置如下: const PIN_Config BoardGpioInitTable[] = [ CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */ CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */ //CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN, /* External flash chip select */ CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN, /* UART RX via debugger back channel */ /*-----当不使用UART时,应该将UART TX拉低,避免漏电 -----*/ CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL, /*CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL,*/ /* UART TX via debugger back channel */ CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master out - slave in */ CC2640R2_LAUNCHXL_SPI0_MISO | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, /* SPI master in - slave out */ CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI clock */ CC2640R2_LAUNCHXL_SPI0_CSN | PIN_BM_INPUT_EN | PIN_PULLDOWN, /*-----这里的配置是多余的,在ccfg.c中配置bootloader back door就足够 -----*/ /*BOOTLOADER_BACKDOOR | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH,*/ PIN_TERMINATE]; |
|
|
|
|
|
合肥冉坤 发表于 2019-10-30 17:38 1、我将两个长度写成一致,SPI的从节点依旧只能接收到第一个字节 2、CSN的管脚使用的是GIO-20,这个管脚是否不可以作为CSN管脚? 3、当SPI MASTER发送数据,CSN管脚为低电平时只传输一个字节的数据,这种情况下SPI SLAVE就可以接收到全部的数据。因此,我推测,CC2640 的SPI的默认配置,就是CSN管脚为低电平时只传输一个字节的数据,多个字节的数据就需要多个低电平。请问这种推测是否正确? |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
351 浏览 1 评论
545 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
790 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
660 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1140 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
83浏览 29评论
295浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
261浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
210浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
68浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 04:00 , Processed in 1.275493 second(s), Total 82, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号