请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430F5529 工具/软件: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);

