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
嗨、伙计
我现在需要在 TI-RTOS 框架下验证标准 SPI 通信 使用 EXP_MSP430F5529LP 开发板, 在用于 MSP430的 TI-RTOS 的相关示例下找不到参考,现在我只能模拟 IIC 框架来执行相关操作, 发现我无法读取数据、我真的不知道问题在哪里! 是否有人提供指导或参考? 我的相关代码如下所示、谢谢、
1. main.c
void SPI_Master_Write_Byte (uint8_t cmd、uint8_t * txBuf、uint8_t txBuf_size) { uint8_t i; uint8_t txBuffer[20]; if (cmd =NULL || txBuf_size <= 0 || txBuf_size > 19) 返回; txBuffer[0]= cmd; for (i=1;i "spi="" bus="" fault\n");="" system_flush();="" }="" hight="" gpio_setoutputhighonpin(gpio_port_p2,="" void="" spi_master_read_byte(uint8_t="" cmd,="" uint8_t="" *rxbuf,uint8_t="" rxbuf_size)="" if(cmd="=" null="" ||="" rxbuf_size="" 19) 返回; SPI_Transaction spiTransaction; spiTransaction.txBuf =空; spiTransaction.rxBuf = rxBuf; spiTransaction.count = rxBuf_size+1; //Cs 低电平 GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0); char txbuf[1]; txbuf[0]= cmd; spiTransaction.txBuf = txbuf; spiTransaction.rxBuf =空; spiTransaction.count = 1; if (SPI_TRANSFER (SPI_MASTER、&spiTransaction)= NULL){ System_printf ("SPI 总线故障\n"); system_flush(); } spiTransaction.txBuf =空; spiTransaction.rxBuf = rxBuf; spiTransaction.count = rxBuf_size; if (SPI_TRANSFER (SPI_MASTER、&spiTransaction)= NULL){ System_printf ("SPI 总线故障\n"); system_flush(); } //Cs 高 GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN0); } /* === taskFxn ==== *此函数的任务是静态创建的。 请参阅工程的.cfg 文件。 */ void SPI_MASTER_taskFxn (UArg0、UArg0 arg1) { /*创建 I2C 以供使用*/ SPI_PARAMS_INIT (&SPI_MASTER_PARAMS); SPI_MASTER_PARAMS.transferMode = SPI_MODE_CALLACK; SPI_MASTER_PARAMS.MODE = SPI_MASTER; SPI_MASTER_PARAMS.bitrate = 1000000、 /*比特率 Hz*/ SPI_MASTER_PARAMS.dataSize = 8; spi_master_Params.frameFormat = SPI_POL0_PHA0; SPI_MASTER = SPI_OPEN (Board_SPI_MASTER、&SPI_MASTER_PARAMS); if (SPI_MASTER = NULL){ System_abort ("初始化 SPI\n"时出错); } 否则{ system_printf ("SPI 已初始化!\n"); } system_flush(); while (1){ Task_sleep (1000); memset (SlaveType2、0、type_2_length); SPI_Master_Read_Byte (CMD_TYPE_2_SLAVE、SlaveType2、TYPE_2_LENGTH); printf ("%s\r\n"、SlaveType2); GPIO_TOGGLE (Board_LED_P4_7);} /*已取消初始化 SPI */ //SPI_Close (SPI_MASTER); //System_printf ("SPI 已关闭!\n"); //System_flush(); }/* ==== main ==== */ int main (void) { /*呼叫板初始化函数*/ Board_initGeneral(); Board_initGPIO(); Board_initSPI(); //构造心跳任务线程 Task_Params taskParams; Task_Params_init (&taskParams); //i2c 主器件 taskParams.arg0 = 1000; taskParams.STACKSIZE = TASKSTACKSIZE; taskParams.stack =&SPI_MASTER_taskStack; Task_construction (&SPI_MASTER_taskStruct,(Task_Functr) SPI_MASTER_taskFxn,&taskParams,NULL); /*启动 BIOS */ BIOS_start(); 返回(0); }
MSP_EXP430F5529LP.c
/* ================================================ DMA ================================================ // /* === MSP_EXP430F5529LP_isrDMA === *这是一个应用程序定义的 DMA ISR。 此 ISR 必须映射并调用 *相应的 Driver_event (handle) API 以指示完成的 DMA 传输。 */ void MSP_EXP430F5529LP_isrDMA (UARg arg) { /*调用 SPI DMA 函数、传递用于 WiFi 的 SPI 句柄*/ SPI_serviceISR ((SPI_Handle)&(SPI_CONFIG[0])); } /* =================================== SPI ======================================================== */ *放入子段中以允许 TI 链接器正确删除项目*/ #if defined (__TI_Compiler_version__) #pragma DATA_SECTION (SPI_CONFIG、".CONST:SPI_CONFIG") #pragma DATA_SECTION (spiUSCIADMAHWAttrs、".CONST:USCIADMAATtrs )#pragma 指令头 include #include SPIUSCIADA_Object spiUSCIADMAObjects[MSP_EXP430F5529LP_SPICOUNT]; uint8_t spiUSCIADDRAscratchBuf[MSP_EXP430F5529LP_SPICOUNT]; const SPIUSCIADA_HWAttrs EXUSCIADDR_MSP430DP_SPIACTRS ={MSP430F5529LP_SPICOUNT];const SPICOT = SPICOT = SPICOT = SPIUNT = SPICOT = SPIUS { baseAddr = USCI_A0_BASE、 时钟源 = USCI_A_SPI_CLOCKSOURCE_SMCLK、 .bitOrder = USCI_A_SPI_MSB_FIRST、 暂存缓冲区 = spiUSCIADDMAscratchBuf[0]、 defaultTxBufValue = 0、 /* DMA */ .dmaBaseAddr = dma_BASE、 /* Rx 通道*/ .rxDMAChannelIndex = DMA_CHANGE_1、 .rxDMASourcedTrigger = DMA_TRIGGERSOURCE_18、 /* Tx 通道*/ TxDMAChannelIndex = DMA_CHANGE_0、 TxDMASourcedTrigger = DMA_TRIGGERSOURCE_19 } }; const SPI_Config SPI_CONFIG[]={ { .fxnTablePtr =&SPIUSCIADA_fxnTable、 .object = spiUSCIADMAObjects[0], hwAttrs = spiUSCIADMAHWAttrs[0](&P) }、 {NULL、NULL、NULL}、 }; //* ===== MSP_EXP430F5529LP_initSPI === */ // MSP430F5529 // -------- // /|\| P2.0|->从器件芯片选择(GPIO) // || | // | P3.3|->数据输出(UCA0SIMO) // | | // 按钮->|P1.1 P3.4|<-数据输入(UCA0SOMI) // | | // | P2.7|->串行时钟输出(UCA0CLK) void MSP_EXP430F5529LP_initSPI (void) { /* *注意:TI-RTOS 示例将 USCIB0配置为 SPI 或 I2C。 因此、 *在中同时使用 I2C 和 SPI 驱动程序时会发生冲突 *应用程序。 修改此文件中的引脚多路复用设置并解析 *运行应用程序前发生冲突。 * /*配置 CS 引脚以禁用 SPI 从设备*/ GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN0); GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN0); /*配置从器件复位控制引脚以禁用 SPI 从器件*/ //GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN5); //GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN5); //GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN5);//现在已初始化 SPI 信号、 //__delay_cycles (100000); //GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN5);//复位从器件 //__delay_cycles (100000); //等待从器件初始化 /* SPI CLK */ GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN7); /* MOSI/SIMO * GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN3); /* MISO/SOMI * GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、GPIO_PIN4); SPI_init(); }
3.cfg
/*========================= Hwi 配置=================== // var halHwi = xdc.useModule('ti.sysbios.hal.Hwi'); var msp430Hwi = xdc.useModule('ti.sysbios.family.msp430.Hwi'); halHwi.checkStackFlag = true; //halHwi.checkStackFlag = false; var hwiParams = new halHwi.Params (); //针对 SPIUSCI 驱动程序的 DMA Hwi * ////SPIUSCIBDMA_hwiIntFxn //dma_vector 50 //USCI_B0_Vector 55 //USCI_A0_Vector 56 hwiParams.arg = 0; halHwi.create (50、"&MSP_EXP430F5529LP_isrDMA"、hwiParams);