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.

[参考译文] RTOS/MSP430F5529:TI-RTOS:SPI CAN#39;t work (CAN#39;t Receive data)

Guru**** 2044370 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/689650/rtos-msp430f5529-ti-rtos-spi-can-t-work-can-t-receive-data

器件型号: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);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您使用的是哪个版本的 TI-RTOS?

    发送是否正常?

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好
    TI-RTOS MSP43x 2.20.00.06
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我已经解决了这个问题、因为我的 DMA 触发器选择有问题、所以现在我要更正代码。 谢谢!

    1。