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.

[参考译文] MSP430F67791:SPI 不工作。

Guru**** 2430860 points
Other Parts Discussed in Thread: MSP430F67791

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/683798/msp430f67791-spi-not-working

器件型号:MSP430F67791
主题中讨论的其他器件: MSP430WARE

大家好、

     现在、我有 MSP430F67791接口 W25q64 Winbond 芯片、但通信无法正常工作、发生了什么情况?

这是我的以下代码详细信息、

接口引脚详细信息、以供您参考、

SCLK P3.3  SCK  
SOMI P3.4  DO
SIMO P3.5  DI
CS   P3.6  CS

void SPI_init (void)

UCA1CTL1 = UCSWRST;

P3OUT &=~BIT6;            //清除 P1.0
P3DIR |= BIT6;               //将 P1.0设置为输出方向
P3SEL0 = BIT3| BIT4 | BIT5;  //将 P3.0、P3.1、P3.2设置为非 IO


UCA1CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC;  
UCA1CTL1 |= UCSSEL_2;// SMCLK

UCA1BR0 |= 0x02;
UCA1BR1 = 0x00;
UCA1MCTLW = 0;


UCA1CTL1 &=~UCSWRST;

void SPI_chipHigh (void)

P3OUT |= CS;

void SPI_chipLow (void)

P3OUT &=~CS;

int datacount=0;

unsigned char data=0;

unsigned char GCU_Tx_Data[10];
unsigned char GCU_recged_Data[10];

uint8_t sFLASH_SendByte (unsigned char * UDATA、unsigned char 计数)

while (!(UCA1IFG &= UCTXIFG));

for (datacount=0;<count;datacount++)

UCA1TXBUF = UDATA[数据连接];


while (!(UCA1IFG & UCRXIFG));

UDATA[0]= UCA1RXBUF;

返回* UDATA;

unsigned char read_SingleBytes (unsigned int Liu Flash_Add){
unsigned char lcu_read_Data=0;
SPI_chipLow ();  
GCU_Tx_Data[0]= 0x03;                       //读取  
GCU_Tx_Data[1]=(Liu Flash_Add >> 16)和0xFF;
GCU_Tx_Data[2]=(Liu Flash_Add >> 8)和0xFF;
GCU_Tx_Data[3]=(Liu Flash_ADD >> 0)和0xFF;  
LCU_READ_Data=sFLASH_SendByte (&GCU_Tx_Data[0]、4);
SPI_chipHigh ();

返回(LCU_READ_Data);

while (1)

Read_SingleBytes (0x000000);

如果有任何编码问题、请告诉我准确的原因以及如何正确地工作、请尽快指导我。Pls 检查 SPI init 函数此初始化寄存器解算是否正确。同时检查整个程序详细信息并尽快指导我解决问题。

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

    器件型号:MSP430F67791

    大家好、

            现在、我有 MSP430F67791接口和 W25Q64FV Winbond 闪存。现在、我已经从存储器10个字节中读取数据。

    但现在我只能使用这个 UCA1RXBUF 读取一个字节。如何使用这个寄存器 UCA1RXBUF 从内存中读取10个字节。

    请举个例子说明这个问题。

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

    您好、Ashokkumar、

    我建议查看 MSP430Ware 中提供的代码示例。 更具体地说、下面链接的代码示例应该是一个良好的起点:

    http://dev.ti.com/tirex/#/?link=Software%2FMSP430Ware%2FDevices%2FMSP430F5XX_6XX%2FMSP430F67791A%2FPeripheral%20Examples%2FRegister%20Level%2Fmsp430f677xA_uscia0_spi_09.c

    此外、我建议阅读 MSP430 MCU 上 eUSCI 和 USCI 串行通信常见问题解决方案的"一般"和"SPI"部分。 查看这些内容后、请告诉我您是否需要进一步的帮助。

    此致、  
    Caleb Overbay

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

    我想您大部分都在那里。 只需获取循环内的 RXBUF、如下所示:

    for (datacount=0;<count;datacount++) {    UCA1TXBUF = uData[datacount];    while (!(UCA1IFG & UCRXIFG));    uData[datacount] = UCA1RXBUF; }
    
    
    
    

    然后、在调用方中、只需将缓冲区扩展到所需的长度(+4)即可。 这将覆盖 Tx 缓冲器、但您已经至少部分完成了。
    --------------------------------------
    此外、我不建议这样做:
    > while (!(UCA1IFG &= UCTXIFG));
    请尝试:
    > while (!(UCA1IFG & UCTXIFG));

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

    uint8_t sFLASH_SendByte (unsigned char * UDATA、unsigned char 计数)


    while (!(UCA1IFG & UCTXIFG));
    UCA1IFG &=~UCRXIFG;           //清除 Rx 中断标志
    for (datacount=0;<count;datacount++)
    UCA1TXBUF = UDATA[数据连接];  // 发送数据
    //等待传输完成
    while (!(UCA1IFG & UCRXIFG));
    * UDATA=UCA1RXBUF;
    返回* UDATA;

    在这种情况下、 大多数时候 UCA1RXBUF 不会尽快读取数据、但 UCA1IFG=0x000002、UCRXIFG=0x000001表明 values.pl的操作是不必要的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    uint8_t sFLASH_SendByte (unsigned char * UDATA、unsigned char 计数)


    while (!(UCA1IFG & UCTXIFG));
    UCA1IFG &=~UCRXIFG; //清除 Rx 中断标志
    for (datacount=0;<count;datacount++)
    UCA1TXBUF = UDATA[数据连接];//发送数据
    //等待传输完成
    while (!(UCA1IFG & UCRXIFG));
    * UDATA=UCA1RXBUF;
    返回* UDATA;


    在这种情况下、大多数时候 UCA1RXBUF 不会尽快读取数据、但 UCA1IFG=0x000002、UCRXIFG=0x000001表明 values.pl的操作是不必要的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    器件型号:MSP430F67791

    大家好、

            现在、我已经通过 MSP430F67791从 Winbond 闪存读取了两个字节的数据。在 MSP430F67791 SPI 模式下、用于通信目的读取和写入。现在、从闪存读取数据、UCA1RXBUF 中提供数据。在该模式中、只有一个数据可用。因此、如何从 UCA1RXBUF 读取另一个数据。

    uint8_t sFLASH_SendByte (unsigned char * UDATA、unsigned char 计数)


    //清除 Rx 中断标志
    while (!(UCA1IFG & UCTXIFG));
    UCA1IFG &=~UCRXIFG;
    for (datacount=0;<count;datacount++)
    //发送数据
    UCA1TXBUF = UDATA[数据连接];
    //等待传输完成
    while (((UCRXIFG=0));
    //接收数据
    * UDATA=UCA1RXBUF;

    返回* UDATA;
    } 如何读取另一个数据。请尽快。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ashok、
    MSP430 RX 缓冲器为1个字节、因此每当接收到新字节时、它将右移前一个字节。

    SPI 是双向方法。 当您发送某些内容时、您还将收到一些内容、为了接收内容、您必须发送一些虚拟字节。

    假设您的命令为1个字节、预期响应为2个字节、因此您的流程应如下所示。

    正在发送
    >>发送一个字节命令
    >>您将收到一个虚拟字节。

    接收
    现在、为了读取命令的2字节响应、您必须发送两个虚拟字节。
    >>发送第一个虚拟字节
    >>您将收到第一个响应字节

    >>发送第二个虚拟字节
    >>您将收到第二个响应字节。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RXIFG 在您发送的每个字节后都会置位、因此您测试的那个字节(几乎)总是过时的。

    我建议的代码没有这个缺陷、因为它在每个字节后清除 RXIFG。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    非常感谢代码现在工作正常。

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

    器件型号:MSP430F67791

    大家好、

              现在我已经使用了 MSP430F67791接口和 W25Q64FV Winbond 闪存。Winbond 闪存的工作范围是108MHz。现在闪存运行正常。我的问题是如何使用 W25Q64FV 为 MSP430F67791计算 SPI 速度配置。

    下面是我的 SPI Init 函数、供您参考、

    /*
    SCLK P3.3   SCK
    SOMI P3.4   MO
    SIMO P3.5   英里
    CS   P3.6   CS
    *

    MSP430晶振频率:32.768kHz

    void SPI_Init (void){

    UCA1CTLW0 |= UCSWRST;


    P3OUT &=~BIT6;           //清除  
    P3DIR |= BIT6;              //设置  

    P3SEL0 = BIT3| BIT4 | BIT5; //设置  



    UCA1CTLW0 |= UCSWRST;                           //**将状态机置于重置中**
    UCA1CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;  // 3引脚、8位 SPI 主器件、时钟极性高电平、MSB

    UCA1CTLW0 |= UCSSEL_2;                          // SMCLK
    UCA1BRW_L = 0x02;                                // 2.
    UCA1BRW_H = 0;                                  //
    UCA1MCTLW = 0;                                  //无调制
    UCA1CTLW0 &=~UCSWRST;                        //**初始化 USCI 状态机**

    如何计算 MSP430F67791和 Q25W64FV FLASH.Pls 的 SPI 速度、请尽快解释并告诉我准确的计算详细信息。

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

    您好、Ashokkumar、

    我一直将所有您的新 SPI 帖子合并回此主题、因此与此主题相关的所有问题都集中在一个帖子中。 如果您仍对此问题有疑问、请在此主题中发帖。

    我建议查看 《MSP430x5xx 和 MSP430x6xx 系列用户指南 》的第40.3.6节、了解如何将 USCI SPI 时钟设置为您所需的频率。 然后、请查看 MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题解决方案的第4.2节"计算最大 SPI 通信速度" 、了解如何计算这两个器件之间可以运行 SPI 的最大速度。

    此致、
    Caleb Overbay