工具/软件:TI-RTOS
您好!
我在这里有一点问题。 我现在需要使用 SPI 来连接一些传感器。 如果我在任务的 main 中调用"spi_init()"、那么出于某种原因、应用程序(nRFConnect)无法与器件建立连接。 但是,当我删除 SPI_init()时,所有内容都开始正常工作。
是否知道调用 SPI_init()可能导致什么问题?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:TI-RTOS
您好!
我在这里有一点问题。 我现在需要使用 SPI 来连接一些传感器。 如果我在任务的 main 中调用"spi_init()"、那么出于某种原因、应用程序(nRFConnect)无法与器件建立连接。 但是,当我删除 SPI_init()时,所有内容都开始正常工作。
是否知道调用 SPI_init()可能导致什么问题?
您好、Marie、
simplelink_cc2640r2_sdk_2_40_00_32
2.多角色
3.除了本例中已经存在的任务外,我还创建了一个新任务,用于使用传感器控制器和处理一些其他与应用相关的函数。 因此、我在我创建的新任务中初始化 SPI、如下所示。
静态空 AppTaskFxn (UArg a0、UArg A1) { /* IPC 的 Msg 对象*/ MsgObj msgPktRec; grSigState_t grState = SIG_LOW; /*初始化传感器控制器*/ AppInitSensorController(); /*初始化 GPIO 模块*/ GPIO_Init(); //GPIO_SelectRelay (All_Relays); //GPI_TRIGGEROffAllRelays(); /* Init Pkt */ pkt_Init(); /* Init SPI */ SPI_Initialize(); /* Init h/w 计时器*/ //initHwTimer (TMR_A); while (1) { 。} }
按照Christin 的要求、下面是我用来初始化和使用 SPI 的一些代码。
引脚初始化
GPIO_PinConfig gpioPinConfigs[]={ /*输入引脚*/ GPIOCC26XX_DIO_13 | GPIO_DO_NOT _CONFIG、/*保留*/ GPIOCC26XX_DIO_14 | GPIO_DO_NOT _CONFIG、/* RED SIG 输入* GPIOCC26XX_DIO_15 | GPIO_DO_NOT _CONFIG、// CC2640R2_LAUNCHXL_SPI_MASTER_READY * GPIOCC26XX_DIO_21 | GPIO_DO_NOT _CONFIG、// CC2640R2_LAUNCHXL_SPI_SLAVE_READY * /*输出引脚*/ GPIOCC26XX_DIO_07 | GPIO_DO_NOT _CONFIG、/* RELAY_1 */ GPIOCC26XX_DIO_06 | GPIO_DO_NOT _CONFIG、/* RELAY_2 */ //GPIOCC26XX_DIO_08 | GPIO_DO_NOT _CONFIG、/*继电器3 * //GPIOCC26XX_DIO_09 | GPIO_DO_NOT _CONFIG、//中继4 * GPIOCC26XX_DIO_30 | GPIO_DO_NOT _CONFIG、// TMP116_EN * /* SPI 闪存 CSn * GPIOCC26XX_DIO_20 | GPIO_DO_NOT _CONFIG、 /* SD CS */ GPIOCC26XX_DIO_21 | GPIO_DO_NOT _CONFIG、 /* Sharp Display - GPIO 配置将在 Display 文件中完成*/ GPIOCC26XX_DIO_24 | GPIO_DO_NOT _CONFIG、/* SPI 芯片选择* GPIOCC26XX_DIO_22 | GPIO_DO_NOT _CONFIG、/* LCD 电源控制* GPIOCC26XX_DIO_23 | GPIO_DO_NOT _CONFIG、/* LCD 使能*/ //GPIOCC26XX_DIO_11 | GPIO_DO_NOT _CONFIG 、}; CONST PIN_Config BoardGpioInitTable[]={ CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭*/ CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭*/ /*按钮为低电平有效*/ CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_BM_迟滞、 /*按钮为低电平有效*/ CC2640R2_LAUNCHXL_DIO15 | PIN_INPUT_EN | PIN_PULLUP|PIN_BM_迟滞、 CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MIN、/*外部闪存芯片选择* CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN、 /*通过调试器反向通道的 UART RX */ CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull、 /*通过调试器反向通道的 UART TX */ //CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输出-从器件输入*/ //CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输入-从器件输出*/ CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输出-从器件输入*/ CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输入-从器件输出*/ CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 时钟*/ PIN_TERMINATE }; /* SPI */ #define CC2640R2_LAUNCHXL_SPI_FLASH_CS ioID_20 #define CC2640R2_LAUNCHXL_FLASH_CS_ON 0 #define CC2640R2_LAUNCHXL_FLASH_OFF 1 /* SPI 板*/ #define CC2640R2_LAUNCHXL_SPI0_MISO ioID_8. /* RF1.20 */ #define CC2640R2_LAUNCHXL_SPI0_MOSI ioID_9. /* RF1.18 */ #define CC2640R2_LAUNCHXL_SPI0_CLK ioID_10 /* RF1.16 */ #define CC2640R2_LAUNCHXL_SPI0_CSn ioID_11 #define CC2640R2_LAUNCHXL_SPI1_MISO PIN_UNLOADed #define CC2640R2_LAUNCHXL_SPI1_MOSI PIN_UNLOADed #define CC2640R2_LAUNCHXL_SPI1_CLK 未分配引脚 #define CC2640R2_LAUNCHXL_SPI1_CSn 未分配的 PIN_DELOADD/* ! *@def CC2640R2_LAUNCHXL_GPIOName *@GPIO 名称的简短枚举 */ typedef enum CC2640R2_LAUNCHXL_GPIOName{ CC2640R2_LAUNCHXL_GPIO_S1 = 0、 //绿色 SIG 输入 CC2640R2_LAUNCHXL_GPIO_S2、 //红色 SIG 输入 CC2640R2_LAUNCHXL_SPI_MASTER_READY、 CC2640R2_LAUNCHXL_SPI_SLAVE_READY、 CC2640R2_LAUNCHXL_GPIO_LED_GREEN、 // Relay_1 CC2640R2_LAUNCHXL_GPIO_LED_RED、 // Relay_2 CC2640R2_LAUNCHXL_GPIO_DIO_8、 // Relay_3 CC2640R2_LAUNCHXL_GPIO_DIO_9、 // Relay_4 CC2640R2_LAUNCHXL_GPIO_TMP116_EN、 CC2640R2_LAUNCHXL_GPIO_SPI_FLASH_CS、 CC2640R2_LAUNCHXL_SDSPI_CS、 CC2640R2_LAUNCHXL_GPIO_LCD_CS、 CC2640R2_LAUNCHXL_GPIO_LCD_POWER、 CC2640R2_LAUNCHXL_GPIO_LCD_ENABLE、 CC2640R2_LAUNCHXL_GPIOCOUNT、 CC2640R2_LAUNCHXL_CS }CC2640R2_LAUNCHXL_GPIOName;
2. SPI 代码
/* spiUser 静态 Lib 变量*/ static SPI_Handle masterSpi; 静态 SPI_Params Parspiams;
/******** *函数名称:SPI_Initialize *说明:Initialize the SPI bus * returns. :无 *参数 :无 / void SPI_Initialize (void) { spi_init(); SPI_Params_init (&spiParams); SPI_InitParams (&spiParams、SPI_BIT_RATE、SPI_FRAME_SIZE、SPI_MODE_BLOCKING、SPI_MASTER、 SPI_POL0_PHA0、NULL); masterSpi = SPI_open (Board_SPI_master、&spiParams); if (masterSpi ==空) { #ifdef ENABLE_DBG_UART display_print0 (dispHandle、30、0、"SPI Init failed!!!!"); #endif } } /******** *函数名称:SPI_InitParams *说明:初始化 I2C 实例对象 *返回 :无 *参数 @pidijPtr:ptr 至 SPI 对象 * @比特率:总线速度 * @txMode:执行模式 * μ@模式:SPI 模式 * @格式:帧格式 * @SPI_CbFunc:回调函数 ******** / void SPI_InitParams (SPI_Params * spiObjPtr、uint32_t 位速率、uint32_t dataSize、SPI_TransferMode txMode、 SPI_Mode、SPI_FrameFormat、 void (* SPI_CbFunc)(SPI_Handle、SPI_Transaction *事务) { spiObjPtr -> bitrate =比特率; spiObjPtr ->dataSize = dataSize; spiObjPtr -> transferMode = txMode; spiObjPtr -> mode = mode; spiObjPtr->frameFormat =格式; spiObjPTR->transferCallbackFxn = SPI_CbFunc; }
- Vinay
您好!
我看到您正在使用阻塞模式、在本例中、任务 SPI 将等待、直到它在阻止其他任务的同时获得某些结果。
我建议您查看我们的 simple_serial_socket 示例、尽管这些示例是针对 UART 设计的、但与 BLE 堆栈集成的概念是相同的。
尊敬的 Christin:
我有一个问题, 如前面所述,即使只是调用 SPI_Init() API,也会导致在不执行任何事务的情况下出现此问题。
当您说、SPI 将阻止、直到它返回某些内容、 我相信只有在执行传输时才有效。 但是、我不会对传输进行任何调用、我只是初始化 SPI 模块、我不确定这会如何阻止任务?
无论采用哪种方式、我都将在明天尝试使用非阻塞回拨方法、并返回结果。
尊敬的 Christin:
我将 SPI 配置为非阻塞模式。 此问题似乎仍然存在、但这次连接确实会建立、然后应用程序会尝试发现服务(加载发现)一段时间、然后断开连接。 在负载发现期间、 以下是终端输出:
0x546C0E9F02EC
连接到1 maxNumBleConns 1
非连接的广告开始了!!!
参数更新0
地址:0x57583209E1FB ConnHdl:0 ConnRole:0x04
GATT 服务器/外设 Rx MTU 大小:65
一段时间后、它会断开连接并低于我获得的输出。
0x546C0E9F02EC
连接到0
可连接的广告开始了!!!
已断开连接!
地址:0x57583209E1FB ConnHdl:0 ConnRole:0x04
GATT 服务器/外设 Rx MTU 大小:65
一些代码供您参考、除了分配回调并更改为回调模式之外、没有重大更改、如下所示:
/*
=== transferCompleteFxn ===
* SPI_TRANSFCTION ()的回调函数。
//
void transferCompleteFxn (SPI_Handle handle、SPI_Transaction *事务)
{
/*不做任何事情*/
}/********
*函数名称:SPI_Initialize
*说明:Initialize the SPI bus
* returns. :无
*参数 :无
/
void SPI_Initialize (void)
{
spi_init();
SPI_Params_init (&spiParams);
SPI_InitParams (&spiParams、SPI_bit_rate、SPI_frame_size、SPI_mode_callback、SPI_master、
SPI_POL0_PHA0、CompletetransferFxn);
masterSpi = SPI_open (Board_SPI_master、&spiParams);
if (masterSpi ==空)
{
#ifdef ENABLE_DBG_UART
log_info0 ("初始化主 SPI\r\n 时出错");
#endif
}
}
/********
*函数名称:SPI_InitParams
*说明:初始化 I2C 实例对象
*返回 :无
*参数 @pidijPtr:ptr 至 SPI 对象
* @比特率:总线速度
* @txMode:执行模式
* μ@模式:SPI 模式
* @格式:帧格式
* @SPI_CbFunc:回调函数
******** /
void SPI_InitParams (SPI_Params * spiObjPtr、uint32_t 位速率、uint32_t dataSize、SPI_TransferMode txMode、
SPI_Mode、SPI_FrameFormat、
void (* SPI_CbFunc)(SPI_Handle、SPI_Transaction *事务)
{
spiObjPtr -> bitrate =比特率;
spiObjPtr ->dataSize = dataSize;
spiObjPtr -> transferMode = txMode;
spiObjPtr -> mode = mode;
spiObjPtr->frameFormat =格式;
spiObjPTR->transferCallbackFxn = SPI_CbFunc;
}
然后,我在 应用程序任务的 main 中调用了 SPI_Initialize()。 有什么见解吗?
很抱歉、由于我过去两周都不上班、回复延迟。
您的 AppTask 优先级是什么?
您能否添加可观察到的射频(LNA 和 PA)以进行调试? 并使用逻辑分析仪检查连接期间的 LNA、PA 和 SPI 引脚活动。
您能否检查是否正在运行堆用尽? 如需更多信息、请参阅以下文档