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.

[参考译文] TMS320F28388D:TMS320F28388D SPI 问题

Guru**** 2655675 points

Other Parts Discussed in Thread: C2000WARE, TMS320F28388D, SYSCONFIG, TMDSCNCD28388D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1369140/tms320f28388d-problems-with-tms320f28388d-spi

器件型号:TMDSCNCD28388D
主题中讨论的其他器件:TMS320F28388DSysConfig、C2000WARE、

工具与软件:

您好

我正在尝试通过 SPI 获得 LS7366R iC 的寄存器值,然而,我有一些问题,我需要一些帮助,因为我不能解决这些问题大约3周...

这是我想在 LS7366R (SPI 从器件)和 TMS320F28388D (SPI 主器件)之间制作的 SPI 协议图。

(这是 LS7366R 数据表中的图表。 LS7366R 数据表链接: https://lsicsi.com/datasheets/LS7366R.pdf 

我设置了 SysConfig 设置、写入代码、并将 SPI 线路连接到示波器。 这些图片是我的 SysConfig 设置、代码和 示波器 信号截屏。

//#############################################################################
//
// FILE:   spi_ex1_loopback.c
//
// TITLE:  SPI Digital Loopback
//
//! \addtogroup driver_example_list
//! <h1>SPI Digital Loopback</h1>
//!
//! This program uses the internal loopback test mode of the SPI module. This
//! is a very basic loopback that does not use the FIFOs or interrupts. A
//! stream of data is sent and then compared to the received stream.
//! The pinmux and SPI modules are configure through the sysconfig file.
//!
//! The sent data looks like this: \n
//!  0000 0001 0002 0003 0004 0005 0006 0007 .... FFFE FFFF 0000
//!
//! This pattern is repeated forever.
//!
//!  \note This example project has support for migration across our C2000 
//!  device families. If you are wanting to build this project from launchpad
//!  or controlCARD, please specify in the .syscfg file the board you're using.
//!  At any time you can select another device to migrate this example.
//!
//! \b External \b Connections \n
//!  - None
//!
//! \b Watch \b Variables \n
//!  - \b sData - Data to send
//!  - \b rData - Received data
//!
//
//#############################################################################
//
//
// $Copyright:
// Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com
//
// Redistribution and use in source and binary forms, with or without 
// modification, are permitted provided that the following conditions 
// are met:
// 
//   Redistributions of source code must retain the above copyright 
//   notice, this list of conditions and the following disclaimer.
// 
//   Redistributions in binary form must reproduce the above copyright
//   notice, this list of conditions and the following disclaimer in the 
//   documentation and/or other materials provided with the   
//   distribution.
// 
//   Neither the name of Texas Instruments Incorporated nor the names of
//   its contributors may be used to endorse or promote products derived
//   from this software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//#############################################################################


/*Included Files*/
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include <stdio.h>


/*IR REG*/
//OP CODE
#define CLR_REG     0x00
#define RD_REG      0x40
#define WR_REG      0x80
#define LOAD_REG    0xC0

//SEL REG
#define MDR0        0x00 | (0b001 << 3)
#define MDR1        0x00 | (0b010 << 3)


/*MDR0 SETTING*/
#define MDR0_4QUAD_MODE  0x00 | 0b11

/*MDR1 SETTING*/
#define MDR1_4BYTE_MODE  0x00 | 0b00


#define STE_HIGH    GPIO_writePin(SPISTE, 1)
#define STE_LOW     GPIO_writePin(SPISTE, 0)
#define STE_STATE   GPIO_readPin(SPISTE)


/*private code*/
#define nData       2
uint16_t TxData[nData] = {0,};
uint16_t RxData[nData] = {0,};

/*Main*/
void main(void)
{
    /*start settings*/
    // Initialize device clock and peripherals
    Device_init();

    // Disable pin locks and enable internal pullups.
    Device_initGPIO();

    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    Interrupt_initModule();

    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    Interrupt_initVectorTable();

    // Board initialization
    Board_init();

    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    EINT;
    ERTM;


    /*USER CODE*/

    STE_HIGH;
    while(1)
    {
        STE_LOW;
        TxData[0] = (WR_REG | MDR0);
        TxData[1] = (MDR0_4QUAD_MODE);
        SPI_writeDataBlockingNonFIFO(mySPI0_BASE, (TxData[0] << 8U));
        SPI_writeDataBlockingNonFIFO(mySPI0_BASE, (TxData[1] << 8U));
//        DEVICE_DELAY_US(200);
        STE_HIGH;
        DEVICE_DELAY_US(20);

//        DEVICE_DELAY_US(1000);
//
//        STE_LOW;
//        SPI_writeDataBlockingNonFIFO(mySPI0_BASE, (RD_REG | MDR0) << 8U);
//        RxData[0] = SPI_readDataBlockingNonFIFO(mySPI0_BASE);
//        DEVICE_DELAY_US(20);
//        STE_HIGH;
//
//        DEVICE_DELAY_US(1000);
    }
}

//
// End File
//

CLK 只能在 STE ==低电平时工作、CLK 也能在 STE ==高电平时工作。
如果您看看主代码的逻辑、绝对没有理由使 CLK 工作、因为它在数据传输后将 STE 升高到高电平、但我不知道它为什么如此。
查看示波器波形、SPI_writeDataBlockingNonFIFO 和 STE 似乎独立运行。
这是因为 STE 和 GPIO 的操作吗? 我不知道为什么。。。

为了解决数据传输函数处于 STE==LOW 状态时不工作的问题、在 SPI_writeDataBlockingNonFIFO 和 STE_HIGH 之间任意指定了 DEVICE_DELAY_US (200)、并获取以下波形。
此时、观察 STE (=SS)波形时、低电平状态恰好保持在200us 左右。

我是按代码顺序编写的、但 GPIO 和 SPI 是独立移动的吗? 我该如何看待这个现象?
如果这是使用 GPIO 进行控制引起的问题、我应如何在 SysConfig 的 SPI 中设置该问题以连续发送两个8位数据?

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

    尊敬的 Sumin:

    令人奇怪的是、协议在 CS 处于高电平时运行、当使用 GPIO 时可能与 CS 的手动时序有关。  首先、 除了讨论将 GPIO 用作 SPI 的其他 E2E 之外、您还可以参阅此 F2838x 示例、该示例与 EEPROM 通信并手动控制 CS (C2000Ware_5_02_00_00\driverlib\f2838x\examples\C28x\SPI_ex6_EEPROM.syscfg)。 请告诉我、这是否有帮助。

    您使用此 GPIO 实现是否有具体原因? 如果不是、我建议使用 SPIPTE 引脚、由硬件来处理 CS。

    此致、
    艾什瓦里亚

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

    尊敬的 Aishwarya Rajesh:

    我已经从 C2000中检查了示例代码、以便与我的代码进行比较、但是、代码的流程和逻辑与我的代码相同。 "当然,在我看来。 它可能不在他人的观点。)

    我正在使用 GPIO、因为我需要连续发送2个8位数据。 但是、当我将 CS 置于硬件模式时、无法连续发送数据。

    我可以通过哪些方法来实现它?  

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

    Sumin、

    我使用 GPIO、因为我需要连续发送2个8位数据。 但将 CS 置于硬件模式时、无法连续发送数据。

    参考 C2000 SPI 以及另一个 SPI、结果表明、在每次 SPI 传输(8-16位)之后、在下一次传输之前至少有一个时钟周期。 如果我理解正确、您可以将 SPI 配置为一次发送2 8位数据、硬件将相应地将其变为高电平和低电平。 这可以放入重复调用的函数中。 现在、看起来发送了两个8位数据、而没有 考虑 SPI 上升时间、保持时间、设置时间等。 此信息在数据表中、应用于添加延迟、这是一种很好的方法。

    此外、我不确定这是否会有所帮助、因为我尚未对其进行测试、但您是否考虑过在 while 循环之外设置 TxData、因为数据保持不变?

    此致、

    艾什瓦里亚  

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

    器件型号:TMDSCNCD28388D

    工具与软件:

    您好!

    我正在 LS7366R iC 和 TI TMDSCNCD28388D 板之间进行 SPI 通信、但 CS 引脚软件控制出现问题。

    我必须通过软件控制 CS、因为我需要连续发送两个8位数据、而 TI 的 API 函数却没有做到这一点。 它只能以一个 CS 低电平发送一段数据。

    所以我问了一个关于我的问题的问题,我从某人那里得到的回答是"通过硬件控制来尝试它"。

    (我之前的问题: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1369140/tms320f28388d-problems-with-tms320f28388d-spi/5231435#5231435)

    要连续发送两个8位数据、我将 SPI 设置为16位模式。 我认为发送一个16位数据的方式与发送两个8位数据的方式相同。

    结果的代码和信号形状如下所示。

    /*Included Files*/
    #include "driverlib.h"
    #include "device.h"
    #include "board.h"
    #include <stdio.h>
    
    
    /*IR REG*/
    //OP CODE
    #define RD_REG      0x40
    #define WR_REG      0x80
    
    //SEL REG
    #define MDR0        0x08
    #define MDR1        0x10
    
    /*MDR0 SETTING*/
    #define MDR0_4QUAD_MODE  0x03
    
    #define STE_HIGH    GPIO_writePin(SPISTE, 1)
    #define STE_LOW     GPIO_writePin(SPISTE, 0)
    #define STE_STATE   GPIO_readPin(SPISTE)
    
    
    /*private code*/
    #define nData       2
    uint16_t TxData[nData] = {0,};
    uint16_t RxData[nData] = {0,};
    
    /*Main*/
    void main(void)
    {
        /*start settings*/
        // Initialize device clock and peripherals
        Device_init();
    
        // Disable pin locks and enable internal pullups.
        Device_initGPIO();
    
        // Initialize PIE and clear PIE registers. Disables CPU interrupts.
        Interrupt_initModule();
    
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        Interrupt_initVectorTable();
    
        // Board initialization
        Board_init();
    
        // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
        EINT;
        ERTM;
    
    
        /*USER CODE*/
    
        //hardware SPI control
        TxData[0] = ((WR_REG | MDR0) << 8U) | MDR0_4QUAD_MODE;
        TxData[1] = (RD_REG | MDR0) << 8U;
    //        TxData[0] = 0x8803;
    //        TxData[1] = 0x4800;
        while(1)
        {
            HWREGH(mySPI0_BASE + SPI_O_TXBUF) = 0;
            SPI_writeDataBlockingNonFIFO(mySPI0_BASE, TxData[0]);
            DEVICE_DELAY_US(30);
    
    
            SPI_writeDataBlockingNonFIFO(mySPI0_BASE, TxData[1]);
            DEVICE_DELAY_US(30);
    
    //        RxData[0] = SPI_readDataBlockingNonFIFO(mySPI0_BASE);
    //        HWREGH(mySPI0_BASE + SPI_O_TXBUF) = 0;
    //        HWREGH(mySPI0_BASE + SPI_O_RXBUF) = {0,};
    //        HWREGH(mySPI0_BASE + SPI_O_DAT) = {0,};
        }
    }
    
    //
    // End File
    //
    

    如果您看看信号、MISO 似乎工作为低电平有效、但是、MISO 的默认状态必须为低电平。

    我想知道、

    1)为什么 MISO 这样的行为?

    2) 2)在代码中、我仅使用 SPI 写入函数。 但是、由于 MISO 信号作出反应、SPI 读取功能也已激活。 如何解释这一点?  

    此外、还有一些我无法理解的其他奇怪输出。

    在上面的代码中,我尝试更改 device_delay_us ()值。 当我将延迟时间设置为短时、虽然我使用了 API 函数、但 CS 引脚未起作用。

    信号图如下图所示。

    我强烈认为 SPICLK 在某种程度上与这个"延迟时间"有关、但我不能猜到有什么"关系"。  

    我还尝试在循环结束时重置 SPI TX 缓冲区、因为我认为它可能会影响下一个循环的操作。

    因此、我写入了 HWREGH (mySPI0_BASE + SPI_O_TXBUF)= 0;结果如下图所示。

    我所做的只是清除 TX 缓冲区、但 CLK 执行了32次。

    我该如何解释这种情况? 我无法 分析这个结果。

      

    请帮我...  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以配置 SPI 以一次发送2 8位数据,硬件将相应地处理其变为高电平和低电平。

    在 SysConfig SPI 菜单中、没有数据号的此类设置。

    同时我检查过 TI 提供的功能、但是找不到这样的功能...

    您是否考虑过在 while 循环之外设置 TxData,因为数据保持不变?

    我也尝试过、结果是一样的。

    我将 SPI 传输函数置于 while 环路中、通过 示波器查看通信信号。

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

    Sumin、

    因为两个线程都在指同一个问题  

    我已经写下了调试该问题所需的步骤。 希望这对您有用。

    您的应用似乎可以使用  spi_ex3_external_loopback 或  spi_ex4_external_loopback_fifo_interrupts 作为起点。

    后退一步、首先验证您看到的数据(数据有效性)。 它是否始终是错误的还是某些时钟脉冲上的错误? 控制器和外设的时钟模式是否已对齐? 由于 SPI 是双工、同步模块、您是否正在从 RX 缓冲区读取数据并同时写入 TX 缓冲区? 您是发送2个8位数据(因为 SPI 经过优化而移位了8位)、而不是1个16位数据(这是不同的)?

    在优化数据写入方面、是否可以使用 FIFO 和中断? 这将简化您的代码并且非常易于使用。 FIFO 深度可设为2、因此每两次写入后、就可以使用中断来进行读取/写入操作。

    现在我们可以解决 CS 的问题:是要求让 CS 在两次写入之间保持高电平、还是在两次背靠背写入之后保持高电平? 原帖中的图片与部分评论有所不同、因此我想再次指出这一点。 如数据表中的这个屏幕截图所示、也可以这样做。

    对于第一种选项、可以一次写入一个数据、并在两者之间添加延迟。 对于第二个选项、则可以无延迟的背靠背写操作。

    2)在代码中我只使用了 SPI 写函数。 但是、由于 MISO 信号作出反应、SPI 读取功能也已激活。 如何解释这一点?  [/报价]

    无论是写入数据和读取虚拟数据、还是其他一些组合、SPI 模块总是同时读取和写入数据。

    因此我写入了 HWREGH (mySPI0_BASE + SPI_O_TXBUF)= 0;结果如下图所示[/报价]

    无需清除 SPI TX 缓冲器、因为  只要 CS 处于低电平、SPI 就会自动将数据移入和移出 TX 缓冲器。  

    再次参考上面链接的两个示例作为起点、并参考 SPI TRM/DS 部分、因为它  详细记录了 SPI 传输过程以及上述配置信息。

    此致、

    艾什瓦里亚

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

    Sumin、

    因此,我想我是同时发送和接收的。

    当 SPI 会自动执行此操作时、您必须确保 TX/RX 缓冲区具有正确的数据或虚拟数据(例如、不希望 SPI 传输不应有的数据)。

    1. SPInonFIFO 和 SPIFIFO 之间有何区别? 我是否必须使用 SPI FIFO 来背靠背发送数据?

    此处提供了主 SPI FIFO 说明、但请阅读"SPI TRM"一章、其中详细介绍了两者的差异以及实现方式。 您 可以使用任一模式 来 背靠背发送数据、但我强烈建议 尽可能使用 FIFO。 显著简化了该方法。

    如果是这样的话,API 函数  'SPI_writeDataBlockingNonFIFO'和'SPI_readDataBlockingNonFIFO'有何区别?
    无论行为是否完全相同、它们都必须存在某种原因。

    直接来自 spi.c 文件中的注释:

    SPI_readDataBlockingNonFIFO - 等待数据被接收、然后从缓冲区中读取它。
    SPI_writeDataBlockingNonFIFO - 等待发送缓冲区为空、然后将数据写入它。

    在 SPI_writeDataBlockingNonFIFO 函数中、我认为数据通过 MOSI 进行传输是在 while 循环中发生的。 但现在我看到、while 循环只是等待 TX 缓冲区为空、而将数据放入 TX 缓冲区的过程为 HWREGH (base + SPI_O_TXBUF)= data;。
    此外、 HWREGH (base + SPI_O_TXBUF)= data;只将数据放在 TX 缓冲区中、并不意味着数据通过 MOSI 移出。

    我的想法对吗?
    如果是这样,我在使用 SPI_writeDataBlockingNonFIFO ()后不得不使用 device_delay_US()的原因是我不得不等待数据移动过程的时间吗?

    [/报价]

    是的、HWREGH 线路将数据放入 TX 缓冲区。  根据 SPI 配置填充 TX 缓冲区后、SPI 硬件会在可用的下一个时钟周期中将其移出。 再次查看您的代码、该延迟可以作为临时的解决方案。 相反、在写入 TX 缓冲区两次之后、您还需要读取 RX 缓冲区两次。 实质上、主要思路是等待 SPI 准备好传输、SPI 发送数据、等待 SPI 准备好传输、SPI 发送数据、 等待 SPI 准备好读取、SPI 读取数据、等待 SPI 准备好读取、SPI 读取数据、然后 重复该过程。

    此致、

    艾什瓦里亚

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

    尊敬的 Aishwarya:
    再次感谢您的答复。

    在得到最新的回复后、我查看了 spi_ex3_external_loopback 以及 spi_ex4_external_loopback_fifo_interrupts。
    我认为在 spi_ex4_external_loopback_fifo_interrupts 代码中会使用 spi_writeDataBlockingFIFO 函数、因为它在 FIFO 模式下工作。  
    但在该示例中、未使用 API 函数、仅使用了私有声明函数。 我认为这是因为这个示例更侧重于"中断"而不是"FIFO"。
    那么、我搜索了使用 FIFO 的 API 函数、找到了 SPI_TRANSDR24Bits 和 SPI_pollingFIFOTransaction!
    SPI_TRANSD24Bits 函数获取24位数据并将其决定为3 8位数据。 然后、它会调用 SPI_pollingFIFOTransaction 、该函数使用 SPI_writeDataBlockingFIFO 将3 8位数据发送到 FIFO 。

    我想发送16位数据、所以我必须使用 SPI_TRANSD16Bits 函数、而只有24位和32位传输函数。
    因此、我使我的函数 SPI_transl16Bits_Sumin 能够以2个8位的速度发送16位数据。 (我  之所以将其命名为 SPI_TRANSPC16Bits_Sumin、是因为 SPI_TRANC16Bits 已被声明。)
    我为 F28388D SPI 主设备编写的代码如下所示:

    /*Included Files*/
    #include "driverlib.h"
    #include "device.h"
    #include "board.h"
    #include <stdio.h>
    
    
    /*IR REG*/
    //OP CODE
    #define RD_REG      0x40
    #define WR_REG      0x80
    
    //SEL REG
    #define MDR0        0x08
    #define MDR1        0x10
    
    /*MDR0 SETTING*/
    #define MDR0_4QUAD_MODE  0x03
    
    #define STE_HIGH    GPIO_writePin(SPISTE, 1)
    #define STE_LOW     GPIO_writePin(SPISTE, 0)
    #define STE_STATE   GPIO_readPin(SPISTE)
    
    
    /*private code*/
    #define nData       2
    uint16_t TxData[nData] = {0,};
    uint16_t RxData[nData] = {0,};
    
    
    void SPI_transmit16Bits_sumin(uint32_t base, uint16_t data_1, uint16_t data_2, uint16_t txDelay);
    
    /*Main*/
    void main(void)
    {
        /*start settings*/
        // Initialize device clock and peripherals
        Device_init();
    
        // Disable pin locks and enable internal pullups.
        Device_initGPIO();
    
        // Initialize PIE and clear PIE registers. Disables CPU interrupts.
        Interrupt_initModule();
    
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        Interrupt_initVectorTable();
    
        // Board initialization
        Board_init();
    
        // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
        EINT;
        ERTM;
    
    
        /*USER CODE*/
    
        //hardware SPI control
        TxData[0] = 0x0000 | (WR_REG | MDR0);      //TxData[0] = 0x0088;
        TxData[1] = 0x0000 | (MDR0_4QUAD_MODE);    //TxData[1] = 0x0003;
        SPI_transmit16Bits_sumin(SPIA_BASE, TxData[0], TxData[1], 0);
    
    
    
        TxData[0] = 0x0000 | (RD_REG | MDR0);      //TxData[0] = 0x0048;
    
        while(1)
        {
            SPI_transmit16Bits_sumin(SPIA_BASE, TxData[0], TxData[1], 0);
        }
    }
    
    
    void
    SPI_transmit24Bits(uint32_t base, uint32_t data, uint16_t txDelay)
    {
        uint16_t i;
        uint16_t rxBuffer[3];
        uint16_t txBuffer[3];
    
        ASSERT(data < ((uint32_t)1U << 24U));
    
        //
        // Empty Receive buffer
        //
        for(i = 0U; i < 3U; i++)
        {
            rxBuffer[i] = 0U;
        }
    
        //
        // Fill Transmit buffer with appropriate data
        //
        txBuffer[0] = (uint16_t)(data >> 16U);   // data[23:16]
        txBuffer[1] = (uint16_t)(data) >> 8U;    // data[15:8]
        txBuffer[2] = (uint16_t)(data) & 0x00FFU; // data[7:0]
    
        //
        // Three 8-bits make a 24-bit
        // Character length = 8
        // number of bytes = 3
        //
        SPI_pollingFIFOTransaction(base, 8U, txBuffer, rxBuffer, 3U, txDelay);
    }
    
    
    void
    SPI_transmit16Bits_sumin(uint32_t base, uint16_t data_1, uint16_t data_2, uint16_t txDelay)
    {
        uint16_t i;
        uint16_t rxBuffer[2];
        uint16_t txBuffer[2];
    
    //    ASSERT(data_1 < ((uint32_t)1U << 16U));
    //    ASSERT(data_2 < ((uint32_t)1U << 16U));
    
        //
        // Empty Receive buffer
        //
        for(i = 0U; i < 2U; i++)
        {
            rxBuffer[i] = 0U;
        }
    
        //
        // Fill Transmit buffer with appropriate data
        // uint32_t > uint16_t : only LOW BITs are saved.
        txBuffer[0] = (uint16_t) data_1;    // data[15:8]
        txBuffer[1] = (uint16_t) data_2; // data[7:0]
    
        //
        // Three 8-bits make a 24-bit
        // Character length = 8
        // number of bytes = 3
        //
        SPI_pollingFIFOTransaction(base, 8U, txBuffer, rxBuffer, 2U, txDelay);
    }
    
    
    
    //
    // End File
    //
    

    结果是成功!!!!
    我得到了下图中所示的信号形状。


    我想我之所以无法使用以前的代码、是因为我没有使用 FIFO。  
    在非 FIFO 模式下、只能进行一个数据传输、因为它只在一次函数调用中处理一个数据。

    感谢您发送编修。  它对我有很大帮助:)

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

    Sumin、

    很高兴听到这个消息!! 由于这是一个新问题、您可以用您的新问题启动一个新问题(如果可能、请将其从该问题中删除)吗? 将内容分开会有所帮助。 我现在将关闭该主题。 谢谢你。

    此致、

    艾什瓦里亚

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

    Sure  Aishwarya,

    我删除了新问题、并将其重新发布到新主题中!