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.

[参考译文] CCS/MSP430F5529:MSP430:SPI 从模式返回的数据错误

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/690116/ccs-msp430f5529-msp430-spi-slave-mode-return-the-data-is-wrong

器件型号:MSP430F5529

工具/软件:Code Composer Studio

大家好

现在、我需要两个 EXP_MSP430F5529LP 开发板来验证 SPI 通信、一个主模式(运行 ti-RTOS)、另一个运行 SPI 从模式(没有 ti-RTOS)、现在我使用【MSP430F55xx_USCI_SPI_standard_slave】SPI 从模式的示例代码。

现在 、我发现 SPI 主模式在第一次读取数据时只是正常的、其余的则发生故障、您必须将从模式开发板复位一次才能读取正常数据。我不知道为什么? 现在只想将从模块板仿真为 SPI 闪存、谁有更好的建议?

谢谢你  

XC_MO

MSP430F55xx_USCI_SPI_standard_slave 代码

//
// MSP430F552x 演示- USCI_A0、SPI 三线制从器件多字节 RX/TX
//
说明:SPI 主器件与 SPI 从器
件通信发送和接收// 3条不同长度的消息。 SPI 从器
件将在等待使用 SPI 中断发送/接收消息时进入 LPM0 //。
// ACLK = nA、MCLK = SMCLK = DCO 16MHz。
//
//
//////// MSP430F5529
// --------
// /|\| P2.0|<-主器件的 GPIO (芯片选择)
// || |
// ---|RST RST |<-主器件的 GPIO (用于复位从器件)
// | |
// | P3.3|<-数据输入(UCA0SIMO)
// | |
// | P3.4|->数据输出(UCA0SOMI)
// | |
// | P2.7|-串行时钟输入(UCA0CLK)
//
Nima Eskandari
// Texas Instruments Inc.
// 2017年4月
//使用 CCS V7.0构建
/*********

#include 
#include 
#include 

//
//示例命令(Example Commands Commands
//

#define 虚拟0xFF

#define SLAVE_CS_IN P2IN
#define SLAVE_CS_DIR P2DIR
#define SLAVE_CS_PIN BIT0

/* CMD_TYPE_X_SLAVE 是主器件发送到从器件的示例命令。
*从属方将发送示例 SlaveTypeX 缓冲区进行响应。
*
* CMD_TYPE_X_MASTER 是主器件发送到从器件的示例命令。
*从器件将初始化自身以接收 MasterTypeX 示例缓冲区。
**/

#define CMD_TYPE_0_SLAVE 0
#define CMD_TYPE_1_SLAVE 1
#define CMD_TYPE_2_SLAVE 2

#define CMD_TYPE_0_MASTER 3
#define CMD_TYPE_1_MASTER 4
#define CMD_TYPE_2_MASTER 5

#define TYPE_0_LENGTH 1
#define TYPE_1_LENGTH 2
#define TYPE_2_LENGTH 6

#define MAX_BUFFER_SIZE 20

/* MasterTypeX 是在主设备中初始化的示例缓冲
区,主设备将*将它们发送给从设备。
* SlaveTypeX 是在从器件中初始化的示例缓冲
区,它们将由从器件*发送到主器件。
*/

uint8_t MasterType2 [type_2_length]={0};
uint8_t MasterType1 [type_1_length]={0、0};
uint8_t MasterType0 [type_0_length]={0};

uint8_t SlaveType2 [type_2_length]={1、'D'、'D'、'1'、'D' '2'};
uint8_t SlaveType1 [TYP_1_LENGTH]={0x15、0x16};
uint8_t SlaveType0 [TYP_0_LENGTH]={0x11};

//*********
//通用 SPI 状态机
//

typedef 枚举 SPI_ModeEnum{
IDLE_MODE、
TX_REG_ADDRESS_MODE、
RX_REG_ADDRESS_MODE、
TX_DATA_MODE、
RX_DATA_MODE、
timeout_mode
}SPI_Mode;

//用于跟踪软件状态机的状态*/
SPI_Mode SlaveMode = RX_REG_ADDRESS_MODE;

//要使用的寄存器地址/命令*/
uint8_t ReceiveRegAddr = 0;

// ReceiveBuffer:用于接收 ISR 中数据的缓冲
区* RXByteCtr:要接收的字节数
*索引: ReceiveBuffer
* TransmitBuffer:用于在 ISR 中传输数据的缓冲区
* TXByteCtr:剩余要传输的字节数
* TransmitIndex:要在 TransmitBuffer 中传输的下一个字节的索引
*/
uint8_t ReceiveBuffer[MAX_buffer_size]={0};
uint8_t RXByteCtr = 0;
uint8_t ProcesseIndex = 0;
uint8_t TransmitBuffer[MAX_buffer_size]={0};
uint8_t TXByteCtr = 0;
uint8_t TransmitIndex = 0;

//根据接收到的 cmd
*
命令初始化软件状态机* cmd:uint8_t transmitCtr

= 0;uint8_t received * uint8命令* uintmtrl * void * mcmd_t register

/*从设备和主设备之间的传输已完成。 使用 cmd
*执行事务后操作。 (将数据从 SendeBuffer
*放置到基于上次接收的相应缓冲区 cmd)
*
cmd:与已完成
的*事务对应的命令/寄存器地址
*
/ void SPI_Slave_TransactionDone (uint8_t cmd);
void CopyArray (uint8_t * source、uint8_t * dest、uint8_t count);
void CopyData (uint8_t);uint0ival (uint0uintval)

void SendUCA0Data (uint8_t val)
{
while (!(UCA0IFG & UCTXIFG)); // USCI_A0 TX 缓冲器就绪?
UCA0TXBUF = val;
}

void SPI_Slave_ProcessCMD (uint8_t cmd)
{
ReceiveIndex = 0;
TransmitIndex = 0;
RXByteCtr = 0;
TXByteCtr = 0;

开关(cmd)
{
情况(CMD_TYPE_0_SLAVE): //发送从属设备 ID (此设备的 ID)
SlaveMode = TX_DATA_MODE;
TXByteCtr = TYPE_0_LENGTH;
//填充 TransmitBuffer
CopyArray (SlaveType0、TransmitBuffer、TYPE_0_LENGTH);
//发送第一个字节
SendUCA0Data (TransmitBuffer[TransmitIndex++]);
TXByteCtr --;
中断;
情况(CMD_TYPE_1_SLAVE): //发送从设备时间(该设备的时间)
SlaveMode = TX_DATA_MODE;
TXByteCtr = TYPE_1_LENGTH;
//填充 TransmitBuffer
CopyArray (SlaveType1、TransmitBuffer、type_1_length);
//发送第一个字节
SendUCA0Data (TransmitBuffer[TransmitIndex++]);
TXByteCtr --;
中断;
情况(CMD_TYPE_2_SLAVE): //发送从属设备位置(该设备的位置)
SlaveMode = TX_DATA_MODE;
TXByteCtr = TYPE_2_LENGTH;
//填充 TransmitBuffer
CopyArray (SlaveType2、TransmitBuffer、TYPE_2_LENGTH);
//发送第一个字节
SendUCA0Data (TransmitBuffer[TransmitIndex++]);
TXByteCtr --;
中断;
情况(CMD_TYPE_0_MASTER):
SlaveMode = RX_DATA_MODE;
RXByteCtr = TYPE_0_LENGTH;
中断;
情况(CMD_TYPE_1_MASTER):
SlaveMode = RX_DATA_MODE;
RXByteCtr = TYPE_1_LENGTH;
中断;
情况(CMD_TYPE_2_MASTER):
SlaveMode = RX_DATA_MODE;
RXByteCtr = TYPE_2_LENGTH;
中断;
默认值:
//while (1);
__no_operation();
中断;
}
}


void SPI_Slave_TransactionDone (uint8_t cmd)
{
开关(cmd)
{
情况(CMD_TYPE_0_SLAVE): //从设备 ID 已发送(此设备的 ID)
中断;
情况(CMD_TYPE_1_SLAVE): //从器件时间已发送(此器件的时间)
中断;
情况(CMD_TYPE_2_SLAVE): //发送从属设备位置(该设备的位置)
中断;
情况(CMD_TYPE_0_MASTER):
CopyArray (ReceiveBuffer、MasterType0、TYPE_0_LENGTH);
中断;
情况(CMD_TYPE_1_MASTER):
CopyArray (ReceiveBuffer、MasterType1、Type_1_length);
中断;
情况(CMD_TYPE_2_MASTER):
CopyArray (ReceiveBuffer、MasterType2、TYPE_2_LENGTH);
中断;
默认值:
__no_operation();
中断;
}
}

void CopyArray (uint8_t *源、uint8_t * dest、uint8_t count)
{
uint8_t copyIndex = 0;
for (copyIndex = 0;copyIndex < count;copyIndex++)
{
dest[copyIndex]= source[copyIndex];
}
}


//*********
//设备初始化
//

void initGPIO()
{
//LEDs
P1OUT = 0x00; //针对 LED 和复位输出 P1DIR 的 P1设置
|= BIT0 + BIT4;

P4DIR |= BIT7;
P4OUT &=~(BIT4);

//SPI 引脚
P3SEL |= BIT3 + BIT4; // P3.3、4选项选择
P2SEL |= BIT7; // P2.7选项选择

}

void initSPI()
{//
时钟极性:无效状态为高
电平//MSB 优先,8位,主器件,3引脚模式,同步
UCA0CTL1 = UCSWRST; //**将状态机复位**
UCA0CTL0 |= UCCKPL + UCMSB + UCSYNC; // 3引脚8位 SPI 从
器件 UCA0CTL1 &=~UCSWRST; //**初始化 USCI 状态机**
UCA0IE |= UCRXIE; //启用 USCI0 RX 中断

slave_CS_DIR &=~(slave_CS_PIN);

}

void initClockTo16MHz ()
{
UCSCTL3 |= SELREF_2; //设置 DCO FLL 基准= REFO
UCSCTL4 |= SE拉美 经济体系2; //设置 ACLK = REFO
_bis_SR_register (SCG0); //禁用 FLL 控制环路
UCSCTL0 = 0x0000; //设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_5; //选择 DCO 范围16MHz 操作
UCSCTL2 = FLLD_0 + 487; //将 DCO 乘法器设置为16MHz
//(N + 1)* FLLRef = Fdco
//(487 + 1)* 32768 = 16MHz
//设置 FLL Div = fDCOCLK
_BIC_SR_register (SCG0); //启用 FLL 控制环路

// DCO 范围位已经存在时、DCO 的最坏情况稳定时间
//已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
// UG 进行优化。
// 32 x 32 x 16 MHz/32、768Hz = 500000 = DCO 稳定的 MCLK 周期
_DELAY_CYCLES (50000);//
//循环直到 XT1、XT2和 DCO 故障标志被清除
操作
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
}

void SetVcoreUp (无符号整型)
{
//打开 PMM 寄存器进行写入
PMMCTL0_H = PMMPW_H;
//设置 SVS/SVM 高侧新电平
SVSMHCTL = SVSHE + SVSHRVL0 *电平+ SVMHE + SVSMHRRL0 *电平;
//将 SVM 低电平设置为新电平
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *电平;
//等待 SVM 稳定
时间((((PMMIFG & SVSMLDLYIFG)=0);
//清除已设置的标志
PMMIFG &=~(SVMLVLRIFG + SVMLMRYIFG)

= 0;//将 PMMCL0设置为新电平
//如果
((PMMIFG & SVMLIFG))、则等待达到新的电平
while (((PMMIFG & SVMLVLRIFG)=0);
//将 SVS/SVM 低电平设置为新的电平
SVSMLCTL = SVSLE + SVSLRVL0 *电平+ SVMLE + SVSMLRRL0 *电平;
//锁定 PMM 寄存器以进行写访问
PMMCTL0_H = 0x00;
}




//主要内容
//进入 LPM0并等待 SPI 中断。 从主器件发送的数据是*
//然后被解释、器件将相应地做出响应 *
//*********

void main (void){
WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器

//while (!(P1IN & BIT4)); //如果来自 MSTR 的时钟信号保持低电平、
//尚未处于 SPI 模式
//???
对于16MHz 时钟、//设置 VCORE = 2
SetVcoreUp (0x01);
SetVcoreUp (0x02);


initClockTo16MHz();
initGPIO();
initspi();

_bis_SR_register (LPM0_bits + GIE); //输入 LPM0,启用中断
__NO_OPERAT();


}//*********



// SPI 中断
//

#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)
#Elif defined (__GNU__)
void __attribute__(interrupt (USCI_A1_vector))#USCI_A0

Compiler #a0_aid!
#endif
{
uint8_t uca0_rx_val = 0;
switch (_even_in_range (UCA0IV、4))
{
情况0:中断; //向量0 -无中断
案例2:
UCA0_Rx_val = UCA0RXBUF;
如果(!(SLAVE_CS_IN 和 SLAVE_CS_PIN)//!!!!!!!!!!!!!!!!!!!!!!!!
{
切换(SlaveMode)
{
情况(RX_REG_ADDRESS_MODE):
ReceiveRegAddr = uca0_Rx_val;
SPI_Slave_ProcessCMD (ReceiveRegAddr);
中断;
情况(RX_DATA_MODE):
ReceiveBuffer[ReceiveIndex++]= uca0_Rx_val;
RXByteCtr---;
IF (RXByteCtr = 0)
{
//完成接收 MSG
SlaveMode = RX_REG_ADDRESS_MODE;
SPI_Slave_TransactionDone (ReceiveRegAddr);
}
中断;
情况(TX_DATA_MODE):
IF (TXByteCtr > 0)
{
SendUCA0Data (TransmitBuffer[TransmitIndex++]);
TXByteCtr --;
}
IF (TXByteCtr = 0)
{
//完成发送 MSG
SlaveMode = RX_REG_ADDRESS_MODE;
SPI_Slave_TransactionDone (ReceiveRegAddr);
}
中断;
默认值:
__no_operation();
中断;
}
}
中断;
案例4:中断; //向量4 - TXIFG
默认值:中断;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CRT 按如下方式返回数据、主 SPI 发送 CMD_TYPE_2_SLAVE

    ABC12^^
    AAAAA^^
    AAAAA^^
    AAAAA^^
    AAAAA^^
    AAAAA^^
    BBBBB^^
    ABC12^^//当我看来复位从机模块板时
    ABC12^^
    AAAAA^^
    AAAAA^^
    AAAAA^^
    AAAAA^^
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这看起来是主设备方面的问题、所以我不知道为什么重置从设备会修复它、除非您也要重置主设备。 即使是第一个事务也是错误的、应该是 ABCD12。

    您如何观察数据? 使用断点并检查主器件侧的缓冲器?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、您能否使用我们的主示例代码检查这一点?

    您还可以查看此应用手册的 SPI 部分(第4节)、并确保主代码遵循建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉、我昨天没有时间回复您。 我花了一天时间来验证 SPI 从模式和主模式通信。 你是对的。 的确、问题出在主器件端、 第一次数据为"ABCD12"时、您也必须重置主器件。

    1.--昨天我重新验证了没有 ti-Rios SPI 的从器件和主器件通信没有问题,我不明白为什么以前有问题。 如下所示

    2.-- 当我将 ti-RTOS 下的主器件更改为 SPI 时,我发现在读取和写入同一从器件模块时出现问题。 我现在读取的数据完全混乱、我不知道为什么!  尽管我知道当我使用 SPI 函数 SPI _Master_read_Byte ()读取 或写入从机模块数据时会出现问题。 但我不知道如何修改它!  

    这里是我的读取和写入函数以及初始化

    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,="" gatemutex_leave(gatemutex_handle,="" key);="" void="" spi_master_read_byte(uint8_t="" cmd,="" uint8_t="" *rxbuf,uint8_t="" rxbuf_size)="" if(cmd="=" null="" ||="" rxbuf_size="" 19)
    //返回;
    
    SPI_Transaction spiTransaction;
    
    //
    IArg 键;
    KEY = GateMutex_enter (gatemutex_handle);
    
    //Cs 低电平
    GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0);
    
    uint8_t txBuf[1];
    txBuf[0]= cmd;
    
    spiTransaction.txBuf = txBuf;
    spiTransaction.rxBuf =空;
    spiTransaction.count = 1;
    
    if (SPI_transfer (spiA1_master、&spiTransaction)= NULL){
    System_printf ("SPI 总线故障\n");
    system_flush();
    }
    
    
    spiTransaction.txBuf =空;
    spiTransaction.rxBuf = rxBuf;
    spiTransaction.count = rxBuf_size;
    
    if (SPI_transfer (spiA1_master、&spiTransaction)= NULL){
    System_printf ("SPI 总线故障\n");
    system_flush();
    }
    
    
    //Cs 高
    GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN0);
    
    //
    GateMutex_leave (gatemutex_handle、key);
    
    }
    
    /*
    === uscia1_SPI taskFxn ===
    *此函数的任务是静态创建的。 请参阅工程的.cfg 文件。
    //
    void spiA1_master_taskFxn (UArg0、UArgarg1)
    {
    /*创建 I2C 以供使用*/
    SPI_PARAMS_INIT (&spiA1_MASTER_PARAMS);
    spiA1_master_Params.transferMode = SPI_MODE_BLOCKING;
    //spiA1_master_Params.transferCallbackFxn = spitransferCallbackFxn;
    spiA1_master_Params.mode = SPI_MASTER;
    spiA1_master_Params.bitrate = 50000、 /*比特率 Hz*/
    spiA1_master_Params.dataSize = 8;
    
    //spiA1_master_Params.frameFormat = SPI_POL1_PHA0;
    
    spiA1_master = SPI_open (Board_SPIA1_master、&spiA1_MASTER_Params);
    if (spiA1_master == NULL){
    System_abort ("初始化 SPI\n"时出错);
    }
    否则{
    system_printf ("SPI 已初始化!\n");
    }
    system_flush();
    
    //gatemute
    GateMutex_Params_init (&G);
    gatemutex_handle = GateMutex_create (&gatemutex_params、NULL);
    if (gatemutex_handle = NULL){
    System_abort ("错误 GateMutex_create\n");
    }
    否则{
    System_printf ("GateMutex_create OK!\n");
    }
    
    
    
    while (1){
    
    SPI_Master_Read_Byte (CMD_TYPE_2_SLAVE、SlaveType2、TYPE_2_LENGTH);
    SlaveType0[type_2_length]= 0;
    printf ("SlaveType2:%s\r\n、SlaveType2);
    
    Task_sleep (1000);
    GPIO_TOGGLE (Board_LED_P4_7);}
    
    
    /*已取消初始化 SPI */
    //spi_close (spiA1_master);
    //System_printf ("SPI 已关闭!\n");
    //System_flush();
    }/*
    
    
    ==== main ====
    */
    int main (void)
    {
    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    Board_initUART();
    Board_initI2C();
    Board_initSPI();
    
    
    //i2c 主器件
    taskParams.arg0 = 1000;
    taskParams.STACKSIZE = TASKSTACKSIZE;
    taskParams.stack =&i2cB0_master_taskStack;
    Task_construct(&i2cB0_master_taskStruct,(Task_Functr )i2cB0_master_taskFxn,&taskParams,NULL);
    
    
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    }
    

    printf 结果

    3.-最后。 我使用示波器检查 SOMIS、返回的数据与我打印的数据相同。 我对 SPI_transfer 函数有点困惑、该函数使用 DMA 而不是示例代码而不使用 TI-RTOS。 我不知道它是否由 DMA 引起、 如果是、如何更改 SPI_Master_Read_Byte ()和 SPI_Master_Write_Byte () 函数?

    谢谢、

    -xC_mo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    能否摆脱 printf()调用? 当您使用 printf()并连接 CCS 时,CCS 将停止目标以读取输出(然后恢复输出)。

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

    你(们)好
    我曾尝试阻止 printf 调用、但问题不在于 printf、 我今天使用逻辑分析仪查看了数据、 当时钟被 SPI 从机模块返回的数据偏移时、就会出现问题。  TI-RTOS 的 SPI 模块数据通过同一函数发送和接收(),我真的不知道如何处理它。

    代码  

    void spia1_master_taskFxn (UArg0、UArgarg1)
    {
    /*创建 I2C 以供使用*/
    SPI_PARAMS_INIT (&spiA1_MASTER_PARAMS);
    spiA1_master_Params.transferMode = SPI_MODE_BLOCKING;
    //spiA1_master_Params.transferCallbackFxn = spitransferCallbackFxn;
    spiA1_master_Params.mode = SPI_MASTER;
    spiA1_master_Params.bitrate = 50000、 /*比特率 Hz*/
    spiA1_master_Params.dataSize = 8;
    
    //spiA1_master_Params.frameFormat = SPI_POL0_PHA1;
    
    spiA1_master = SPI_open (Board_SPIA1_master、&spiA1_MASTER_Params);
    if (spiA1_master == NULL){
    System_abort ("初始化 SPI\n"时出错);
    }
    否则{
    system_printf ("SPI 已初始化!\n");
    }
    system_flush();
    
    //gatemute
    GateMutex_Params_init (&G);
    gatemutex_handle = GateMutex_create (&gatemutex_params、NULL);
    if (gatemutex_handle = NULL){
    System_abort ("错误 GateMutex_create\n");
    }
    否则{
    System_printf ("GateMutex_create OK!\n");
    }
    
    
    
    while (1){
    
    txbuf[0]= 0xf0;//cmd;
    txbuf[1]= 0xff;
    txbuf[2]= 0xff;
    txbuf[3]= 0xff;
    txbuf[4]= 0xff;
    txbuf[5]= 0xff;
    spiTransaction.count = 6;
    spiTransaction.rxBuf = rxBuf;
    spiTransaction.txBuf = txbuf;
    
    if (!spi_transfer (spiA1_master、&spiTransaction)){
    System_printf ("SPI 总线故障\n");
    system_flush();
    返回;
    }
    
    } 

    谢谢

    XC.mo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    txbuf[0]=0xf2,从机模块应返回“ABCD12”
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好

    无意识地、我已经解决了我的问题、现在花时间更新状态并提交我的解决方案。

    问题1: 我发布的图片是右移17个时钟。  实际上,由于其他原因,1个时钟偏移和2个字节(16个时钟)是一个问题。 有关如何解决时钟偏移问题、请参阅以下链接

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/616900?tisearch=e2e-sitesearch&keymatch=msp430%20spi

    issu2 : 2字节(16时钟) 偏移。  我不知道如何操作、但我希望我发布的代码能帮助那些与我有同样问题的人。

    void SPI_Master_read_Byte (uint8_t cmd、uint8_t * rxBuf、uint8_t rxBuf_size)
    {
    uint8_t txBuffer[20];
    
    if (cmd =NULL || rxBuf_size <=0)
    返回;
    
    SPI_Transaction spiTransaction;
    
    IArg 键;
    //
    KEY = GateMutex_enter (gatemutex_handle);
    
    //Cs 低电平
    Board_SPIA1_MASTER_CS_LOW;
    
    
    txBuffer[0]= cmd;
    txBuffer[1]= 0;
    spiTransaction.txBuf = txBuffer;
    spiTransaction.rxBuf =空;
    spiTransaction.count = 1;
    if (SPI_transfer (spiA1_master、&spiTransaction)= NULL){
    System_printf ("SPI 总线故障\n");
    system_flush();
    }
    
    uint8_t 计数;
    计数= rxBuf_size;
    while (count---){
    spiTransaction.txBuf =空;
    spiTransaction.rxBuf = rxBuf++;
    spiTransaction.count = 1;
    if (SPI_transfer (spiA1_master、&spiTransaction)= NULL){
    System_printf ("SPI 总线故障\n");
    system_flush();
    }
    }
    
    //Cs 高
    Board_SPIA1_MASTER_CS_HIGH;
    
    //
    GateMutex_leave (gatemutex_handle、key);
    
    }
    
    void spiA1_master_taskFxn (UArg0、UArg1 arg1)
    {
    /*创建 SPI 供使用*/
    SPI_PARAMS_INIT (&spiA1_MASTER_PARAMS);
    spiA1_master_Params.transferMode = SPI_MODE_BLOCKING;
    //spiA1_master_Params.transferCallbackFxn = spitransferCallbackFxn;
    spiA1_master_Params.mode = SPI_MASTER;
    spiA1_master_Params.bitrate = 50000、 /*比特率 Hz*/
    spiA1_master_Params.dataSize = 8;
    
    spiA1_master_Params.frameFormat = SPI_POL1_PHA1;
    
    spiA1_master = SPI_open (Board_SPIA1_master、&spiA1_MASTER_Params);
    if (spiA1_master == NULL){
    System_abort ("初始化 SPI\n"时出错);
    }
    否则{
    system_printf ("SPI 已初始化!\n");
    }
    system_flush();
    
    //gatemute
    GateMutex_Params_init (&G);
    gatemutex_handle = GateMutex_create (&gatemutex_params、NULL);
    if (gatemutex_handle = NULL){
    System_abort ("错误 GateMutex_create\n");
    }
    否则{
    System_printf ("GateMutex_create OK!\n");
    }
    
    
    while (1){
    
    
    SPI_Master_Read_Byte (CMD_TYPE_0_SLAVE、SlaveType0、TYPE_0_LENGTH);
    //SlaveType0[type_0_length]= 0;
    printf ("SlaveType0:0x%x\r\n"、SlaveType0[0]);
    Task_sleep (200);
    
    SPI_Master_Read_Byte (CMD_TYPE_1_SLAVE、SlaveType1、TYPE_1_LENGTH);
    //SlaveType0[TYPE_1_LENGTH]= 0;
    printf ("SlaveType1:0x%x 0x%x\r\n"、SlaveType1[0]、SlaveType1[1]);
    Task_sleep (200);
    
    SPI_Master_Read_Byte (CMD_TYPE_2_SLAVE、SlaveType2、TYPE_2_LENGTH);
    //SlaveType0[type_2_length]= 0;
    printf ("SlaveType2:%s\r\n、SlaveType2);
    
    //System_printf ("%s\r\n"、rxbuf);
    //System_flush();
    
    Task_sleep (1000);
    GPIO_TOGGLE (Board_LED_P1_0);;
    }
    
    
    /*已取消初始化 SPI */
    //spi_close (spiA1_master);
    //System_printf ("SPI 已关闭!\n");
    //System_flush();
    }/*
    
    
    ==== main ====
    */
    int main (void)
    {
    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    Board_initUART();
    Board_initI2C();
    Board_initSPI();
    //SPI 主器件
    taskParams.arg0 = 1000;
    taskParams.STACKSIZE = spiA1_TASKSTACKSIZE;
    taskParams.stack = spiA1_master_taskStack (&S);
    Task_construction (&spiA1_master_taskStruct,(Task_Functr) a1_master_taskFxn、&taskParams、NULL);
    
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    }
    
    

    此致

    XC.mo