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.

[参考译文] TMS320F28376S:SPI 问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/914743/tms320f28376s-spi-issue

器件型号:TMS320F28376S
主题中讨论的其他器件:C2000WARE

尊敬的先生:

我们正在开发基于28376s 的控制器,并且在 SPI 从设备传输方面存在一些问题  

SPI 接口如下所示  

1.一个装置配置为 SPI 主设备,发送8个 SPI 字(每个16位)的每个卡盘 (使用 SPI TX FIFO)  -不中断  

  从机数据也从 RX FIFO 中读取(当 FIFO 不为空时),出于测试目的,设备发送  8个0xaa55字 (这在从机端进行验证)

2.秒单元 配置为 SPI 从属设备,每1ms 检查一次 SPI RX FIFO,如果没有空,则读取 FIFO 中所有可用的数据 ,并插入要为下一个 SPI 通信传输的数据

 使用主器件,也可以使用8个 SPI 字(16位),出于测试目的,该单元发送8个0xbb66字(这在主器件上已验证)

这是使用各种 SPI CLK ( 2.5MHz、1MHz、400kHz)进行测试 的,问题仍然存在 ,这是从机数据看起来损坏 (就好像它被移动了几位一样) 的时刻,它每5到10分钟发生一次

在 从器件侧写入 SPI TX 缓冲器时是否出现问题(因为它未满)?  我猜、当从器件在与 SPI 主器件通信的同时写入 SPI TX FIFO 时、可能会有一些冲突

但我认为在写入 FIFO 而不是直接写入 SPIDAT 时应该会出现任何问题

请就此 事项提出建议

  

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

    Eyal、

    如何直接写入 SPITX FIFO 寄存器? 您的 SPI 主设备和从设备是否采用相同的时钟方案进行通信?

    此致、

    曼诺伊

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

    你好,Manjo  ,

    我不直接写入 FIFO、而是使用 SPITXBUF 和 SPIRXBUF 来连接 RX 和 TX 的 FIFO

    2、时钟频率上升时无延迟(例如、在上升沿发送下降沿捕捉)

    请参阅以下内容、了解 SPI 从主器件之间的正确通信    

     每1ms 主器件发送  8个16位字(全部 为0xaa55)

             从器件发送   8x 16位 字 (全部为0xbb66)

    当问题出现时(每5-10分钟),它只会破坏 SPI 从站数据 (例如 MISO),但会使其产生错误  

    如下面的示例所示  

    被 2位移位的1.word #5  现在是0x2ED9 (即0xBB66>>>>2)  - X ms 后

    2.word #5 被3位移位,  现在为0x176c (即0xBB66>>3)    - 在 X+1ms 之后

    3.word #5被4位移位 ... 现在是 0x0BB6   (即0xBB66>>>4) - 在 X+2 ms 之后

    …   

    一个字 #6 被2位移位、…

    I.字 #7 被2位移位、…

    就像问题在 SPI 从器件发送的字之间传输一样。

    我猜、每隔几分钟 SPI 主设备和从设备就会明确地相互同步、这样、当我写入 SPITXBUF 时、主设备会发送数据、并会发生这种奇怪的现象

    下面是视频中显示问题的简短视频(希望可以显示)  

    主器件发送8xSPI 字0x0000 (每1ms 一次)

    从器件发送 8xSPI 字0xbb66 (每1ms 一次)   

    您可以看到"问题"在 MISO (例如从机传输)、字#3 、然后是4、然后是5之间传播 、直至出现故障  

    e2e.ti.com/.../20200616_5F00_125632.mp4

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

    Eyal、

    我仍然不清楚是什么原因导致了这种情况。 您能否向我们发送您的代码、以检查您是否正确配置了所有内容?

    其他问题:-

    1) 1)您是否有两个通过 SPI 连接的物理 F28376S 器件?

    2) 2)您是否在一个 F28376S 器件中将 SPIA 配置为主器件、将 SPIB 配置为从器件?

    3) 3)每1ms 由什么触发一次主器件的 SPI 通信?

    4) 4)您不对主器件和从器件使用 SPI 中断是否正确?

    5) 5)您是否使用 CPU/DMA 写入 SPI 从器件发送寄存器? 您确定是从设备。 是否向 SPITXBUF 寄存器写入8个0xBB66字?

    6) 6)我希望在 SPI 主器件开始传输0xAA55之前、从器件 TX FIFO 中填充了0xBB66。 您如何确保这一点?

    7) 7)您是否仅在示波器上看到损坏的消息(可能的示波器伪迹)(或)您是否在主接收寄存器中看到接收损坏的数据?

    此致、

    曼诺伊

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

    您好,Manoj,  

    感谢您的快速回复。

    1.我正在进行的测试包括2个控制器   

       a. 1个单元为 SPI 主设备  

       b. 1个单元为 SPI 从器件

       c.连接两个装置 SPI 信号(CS、CLK、MOSI、MISO)的电缆  

    2.两个装置都使用 SPIA  

    3.两个单元都有50us 的中断触发器,其中每隔20个中断触发一次 SPI 通信(例如50*20=1ms)

      50us 来自 FPGA (以非常确定的方式) ,周期为1ms  

        a. SPI 主设备-从 SPI RX FIFO 读取(如果 FIFO 不为空),写入 SPI TX FIFO (如果 FIFO 未满) 8x字 的0xaa55

        b. SPI 从器件  -如果 SPI RX FIFO 不为空则读取   

                    i.读取所有 SPI RX 字

                    II.写入到 SP TX 字  8个字  的0xbb66 (仅当 FIFO 有空间用于其他8个字时)

    使用基于中断的 SPI 的4.no dout 更合适,但控制器的主要用途是运动控制  

      由于大多数时间伺服算法都在中断(带有电流环路、速度环路、位置的 ALNOG)下运行,因此它是相当八进制的  

      这是以这种方式实现的

    5.我没有将 DMA 用于 SPI (我将其用于其他目的)

    6.是的 SPI 从器件在大多数情况下都可以使用8个0xbb66字进行写操作(在两侧都有版本),但会出现问题  

      在 5/10分钟内, 您可以在上面的示波器屏幕上 (以及视频)看到 MISO 上的数据  为0xbb66   

    7.不管怎么说,SPI 从设备/SPI 主设备  将发生完全对齐的情况  ,因为主设备在1ms 内发送多达8个字(FIFO 深度为16)

      所以他们会赶上来(可能一开始就会有一些交通工具),而且他们都以 1毫秒为基础工作  

      我还处理 FIFO 溢出(但我看不到它的发生)

    8.我可以在缓冲区读取中看到一些字词 ,请注意,它不是 rendom courrption,而是相关的语音如何移动重定位器

      例如 ,它不是输出 0xbb66  ,而是输出 0xbb66>>>>2

       会话 x+1ms  ,而不是输出 0xbb66  ,它是输出 0xbb66>>>>3

       会话 x+2ms  ,而不是输出 0xbb66  ,它是输出 0xbb66>>>>4

       等等...

    BR、

    Eyal

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

    Eyal、

    感谢您的澄清。 我尝试修改 SPI_ex3_external_loopback_fifo_interrupts 示例代码以重现问题。 但是,我没有成功地重现问题。 我能够实现全双工通信、而不会出现任何问题。 随附的是经修改的 C2000Ware 代码、供您查看。

    如果不了解您的 SPI 相关代码、我认为我不能提供帮助。

    e2e.ti.com/.../spi_5F00_ex3_5F00_external_5F00_loopback_5F00_fifo_5F00_interrupts.c

    此致、

    曼诺伊

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

    您好、Manoj、

    我已经查看了您设置的代码,  

    1.我看到您正在使用中断(在我使用轮询模式时),尽管如此,这不需要出现问题

    2.我正在使用两个散射装置,而在代码 Isse 中,您使用的是相同的 IC,但散射 SPI (例如 A、B)

    我认为我的问题是在从器件端  ,在 SPI 引脚上接收时,我会转到 SPITXBUF,就像在那样

    SPI 从器件不发送我想要的数据、而是发送它接收的数据  

    例如正常 会话

    SPI Salve 发送 地址:0x5500 0x5501 0x5502 0x5503 0x5504 0x5505 0x5506 0x5507

             接收 : 0xAA00 0xAA01 0xAA02 0xAA03 0xAA04 0xAA05 0xAA06 0xAA07

    发生错误时  

    SPI Salve 发送 地址:0x5500  0x5501 0x5502  0xAA03 0x5504 0x5505 0x5506 0x5507

             接收 : 0xAA00 0xAA01 0xAA02 0xAA03 0xAA04 0xAA05 0xAA06 0xAA07

    从机明确发送0xaa03 而不是 0x5503 (就像接收数据进入 TX FIFO 一样)   

    可以吗 ?

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

    Eyal、

    我不能猜测出可能出现了什么问题。 您是否介意发送代码片段?

    此致、

    曼诺伊

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

    您好,Manoj,

    我不是想猜测,只是想说你可能会处理外部的双模问题 ,或者我可能会在 概念上做一些严肃的事情。

     我将对代码的结构进行编译  

    //初始化 SPI 的 GPIO

    void ConfigureSPIGPIO()
    {
    EDIS;
    
    /*SPI_DIR (主设备=低电平、从设备=高电平)- Control 422线路缓冲器*/
    GPIOSetupPinMux (SPIA_DIR_GPIO_INDEX、0、0);
    GPIOSetupPinOptions (SPIA_DIR_GPIO_INDEX、GPIO_OUTPUT、GPIO_SYNC);
    
    /*SIMOA*/
    GPIOSetupPinMux (SPIA_SIMO_GPIO_INDEX、0、1);
    GPIOSetupPinOptions (SPIA_SIMO_GPIO_INDEX、GPIO_OUTPUT、GPIO_异 步| GPIO_PULLUP);
    
    /*Somia*/
    GPIOSetupPinMux (SPIA_SOMI_GPIO_INDEX、0、1);
    GPIOSetupPinOptions (SPIA_SOMI_GPIO_INDEX、GPIO_INPUT、GPIO_异 步| GPIO_PULLUP);
    
    /*CLKA*/
    GPIOSetupPinMux (SPIA_CLK_GPIO_INDEX、0、1);
    GPIOSetupPinOptions (SPIA_CLK_GPIO_INDEX、GPIO_OUTPUT、GPIO_异 步| GPIO_PULLUP);
    
    /*Stena*/
    GPIOSetupPinMux (SPIA_CLK_GPIO_ENA、0、1);
    GPIOSetupPinOptions (SPIA_CLK_GPIO_ENA、GPIO_OUTPUT、GPIO_异 步| GPIO_PULLUP);
    
    EALLOW;
    } 


    //初始化 SPI Mourdle (下面是调用 Master / salve)
    void ConfigureSPI (sSPIConfig_t * pSPIConfig)
    {
    int lsp_clk_div、spi_bit_rate;
    
    /*配置422收发器方向(主/从)*/
    if (pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_MODE = SPI_MASTER)
    {
    /*将 SPI_DIR 设置为主接口*/
    SPIA_DIR_SET_MASTER();
    }
    其他
    {
    /*将 SPI_DIR 设置为从器件*/
    SPIA_DIR_SET_SLAVE ();
    }
    
    /*配置并重置 SPI FIFO*/
    SpiaRegs.SPIFFTX.ALL = 0xE040;
    SpiaRegs.SPIFFRX.ALL = 0x2044;
    SpiaRegs.SPIFFCT.all = 0x0;
    
    
    /*重置 SPI*/
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    
    /*时钟极性和数据锁存器*/
    开关(pSPIConfig->SPI_CONFIG_WORD.STATUS.clk_scheme)
    {
    案例 SPI_clk_pol 上升沿:
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    中断;
    SPI_clk_pol 上升沿延迟情况:
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 1;
    中断;
    
    案例 SPI_clk_pol _后退_EDGE:
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    中断;
    
    案例 SPI_clk_pol _后退_EDGE_With 延迟:
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 1;
    中断;
    
    默认值:
    pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_MODE = SPI_DISABLE;
    中断;
    
    }
    
    /*SPI 字长*/
    if (pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_WORD_SIZE <= SPI_WORD_Len_16bit)
    SpiaRegs.SPICCR.bit.SPICHAR = pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_WORD_SIZE;
    
    /*环回*/
    SpiaRegs.SPICCR.bit.SPILBK = 0;
    
    开关(pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_MODE)
    {
    SPI_SLAVE 情况:
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
    SpiaRegs.SPICTL.bit.TALK = 1;
    pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_BAUD_RATE = SPI_clk_5MHz;
    中断;
    
    SPI_MASTER 案例:
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
    SpiaRegs.SPICTL.bit.TALK = 1;
    中断;
    
    案例 SPI_SLAVE_withot_transmit:
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
    SpiaRegs.SPICTL.bit.TALK = 0;
    pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_BAUD_RATE = SPI_clk_5MHz;//SPI_clk_5MHz;
    中断;
    
    案例 SPI_DISABLE:
    中断;
    }
    
    /*设置 SPI 波特率*/
    开关(pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_BAUD_RATE)
    {
    
    /*LSPCLK=20Mhz,SPIBRR=100 => 20e6/100=200kbps*/
    SPI_clk_200kHz 案例:
    lsp_clk_div = 5;//SYSCLK/10
    SPI_BIT_RATE = 100;
    中断;
    
    /*LSPCLK=20Mhz,SPIBRR=50 => 20e6/50=400kbps*/
    SPI_clk_400kHz 案例:
    lsp_clk_div = 5;//SYSCLK/10
    SPI_BIT_RATE = 50;
    中断;
    
    /*LSPCLK=20Mhz,SPIBRR=25 => 20e6/25=800kbps*/
    SPI_clk_800kHz 案例:
    lsp_clk_div = 5;//SYSCLK/10
    SPI_BIT_RATE = 25;
    中断;
    
    /*LSPCLK=20Mhz,SPIBRR=20=> 20e6/20=1Mbps*/
    SPI_clk_1MHz 案例:
    lsp_clk_div = 5;//SYSCLK/10
    SPI_BIT_RATE = 20;
    中断;
    
    /*LSPCLK=20Mhz,SPIBRR=13 => 20e6/13=1.538Mbps*/
    SPI_clk_1_5MHz 案例:
    lsp_clk_div = 5;//SYSCLK/10
    SPI_BIT_RATE = 13;
    中断;
    
    /*LSPCLK=20Mhz,SPIBRR=10=> 20e6/10=2Mbps*/
    SPI_clk_2MHz 案例:
    lsp_clk_div = 5;//SYSCLK/10
    SPI_BIT_RATE = 10;
    中断;
    
    /*LSPCLK=20Mhz,SPIBRR=10=> 20e6/10=2Mbps*/
    SPI_clk_2_5MHz 案例:
    lsp_clk_div = 5;//SYSCLK/10
    SPI_BIT_RATE = 8;
    中断;
    
    /*LSPCLK=50MHz,SPIBRR=16=>50e6/16=3.125Mbps*/
    SPI_clk_3MHz 案例:
    lsp_clk_div = 2;//SYSCLK/4
    SPI_BIT_RATE = 16;
    中断;
    
    /*LSPCLK=50MHz,SPIBRR=16=>50e6/14=3.57Mbps*/
    SPI_clk_3_5MHz 案例:
    lsp_clk_div = 2;//SYSCLK/4
    SPI_BIT_RATE = 14;
    中断;
    
    /*LSPCLK=20Mhz,SPIBRR=5=> 20e6/5=4Mbps*/
    案例 SPI_clk_4Mhz:
    lsp_clk_div = 5;//SYSCLK/10
    SPI_BIT_RATE = 5;
    中断;
    
    /*LSPCLK=40MHz,SPIBRR=1 => 50e6/10=5Mbps*/
    SPI_clk_5MHz 案例:
    lsp_clk_div = 2;//SYSCLK/4
    SPI_BIT_RATE = 10;
    中断;
    
    默认值:
    lsp_clk_div = 2;//SYSCLK/4
    SPI_BIT_RATE = 100;
    中断;
    
    }
    
    EALLOW;
    ClkCfgRegs.LOSPP.bit.LSPCLKDIV = LSP_clk_div;
    EDIS;
    
    /*设置 LSPCLK*/
    SpiaRegs.SPICTL.bit.SPIINTENA=0;
    
    //设置波特率
    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BIT_RATE - 1;
    
    //设置空闲位
    //在断点上停止不会停止 SPI
    SpiaRegs.SPIPRI.bit.FREE = 1;
    
    SpiaRegs.SPICCR.bit.HS_MODE = 0;
    
    //解除 SPI 复位
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    
    } 


    //主初始化
    空初始
    化{ 

    (笑声)
    ConfigureSPIGPIO();
    /*仅用于测试*/ sSPIConfig.SPI_CONFIG_WORD.STATUS.SPI_MODE=SPI_MODE;//SPI_MASTER 或 SPI_SLAVE,每个目标对应一个 sSPIConfig.SPI_CONFIG_WORD.STATUS.SPI_BAUD_RATE =SPI_clk_1MHz;//SPI_clk_1_5MHz;//SPI_clk_400khzspi_clk_400kHz; sSPIConfig.spi_config_word.state.clk_scheme=spi_clk_pol 上升沿; sSPIConfig.SPI_max_num_of_wors=8; sSPIConfig.SPI_CONFIG_WORD.STATUS.num_of _SPI_TX_WORD = 8; sSPIConfig.spi_config_word.state.spi_word_size =spi_word_len_16位; sSPIConfig.debug_cnt=0; sSPIConfig.debug_err_flag=0; if (sSPIConfig.SPI_CONFIG_WORD.STATUS.SPI_MODE=1) { sSPIConfig.SPI_TX[0]= MASTER_WORD; sSPIConfig.SPI_TX[1]=master_word; sSPIConfig.SPI_TX[2]= MASTER_WORD; sSPIConfig.SPI_TX[3]=master_word; sSPIConfig.SPI_TX[4]=master_word; sSPIConfig.SPI_TX[5]= MASTER_WORD; sSPIConfig.SPI_TX[6]= MASTER_WORD; sSPIConfig.SPI_TX[7]= MASTER_WORD; } 其他 { sSPIConfig.SPI_TX[0]=从器件字; sSPIConfig.SPI_TX[1]=从器件字; sSPIConfig.SPI_TX[2]=从器件字; sSPIConfig.SPI_TX[3]=SLAVE_WORD; sSPIConfig.SPI_TX[4]=从器件字; sSPIConfig.SPI_TX[5]=从器件字; sSPIConfig.SPI_TX[6]=从器件字; sSPIConfig.SPI_TX[7]=从器件字; } ConfigureSPI (&sSPIConfig); }





    /*SPI 读取/写入用于中断每1ms 调用一次主从器件*/
    unsigned short SPIWriteRead (sSPIConfig_t * pSPIConfig)
    {
    
    int i、max_rx_spi_word;
    
    if (pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_MODE!= SPI_DISABLE)
    {
    /*检查是否收到 SPI 数据(上一季度)*/
    IF (SpiaRegs.SPIFFRX.bit.RXFFST > 0)
    {
    IF (SpiaRegs.SPIFFRX.bit.RXFFST > pSPIConfig->SPI_max_num_of _words)
    {
    MAX_Rx_SPI_WORD = pSPIConfig->SPI_max_num_for_words;
    }
    其他
    {
    MAX_Rx_SPI_WORD = SpiaRegs.SPIFFRX.bit.RXFFST;
    }
    
    /*读取以前的 SPI 数据*/
    对于(I = 0;I < max_rx_spi_word;i++)
    pSPIConfig->SPI_Rx[i]= SpiaRegs.SPIRXBUF;
    
    /*收到的数据的更新数*/
    pSPIConfig->SPI_Rx_num_for_words = max_Rx_SPI_word;
    
    if (pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_MODE = SPI_SLAVE)
    {
    /*检查 TX FIFO 是否未满*/
    if (((16 - pSPIConfig->SPI_CONFIG_WORD.STATUS.num_of _SPI_TX_WORD)> SpiaRegs.SPIFFTX.bit.TXFFST)
    {
    /*发送*/
    对于(i = 0;i < pSPIConfig->SPI_CONFIG_WORD.STATUS.num_of _SPI_TX_WORD;i++)
    {
    SpiaRegs.SPITXBUF = pSPIConfig->SPI_TX[i];
    }
    }
    
    
    
    否则 pSPIConfig->SPI_Rx_num_of_wors=0;
    
    if (pSPIConfig->SPI_CONFIG_WORD.STATUS.SPI_MODE = SPI_MASTER)
    {
    /*检查 TX FIFO 是否未满*/
    if (((16 - pSPIConfig->SPI_CONFIG_WORD.STATUS.num_of _SPI_TX_WORD)> SpiaRegs.SPIFFTX.bit.TXFFST)
    {
    /*发送*/
    对于(i = 0;i < pSPIConfig->SPI_CONFIG_WORD.STATUS.num_of _SPI_TX_WORD;i++)
    {
    SpiaRegs.SPITXBUF = pSPIConfig->SPI_TX[i];
    }
    }
    
    
    }
    返回0;
    }
    

    
    


    //外部中断(来自 FPGA),每50us __interrupt void exInterrupt_isr (void) { /*通用函数指针*/ /*第一阶段-调用 DSPCodeLoading()-将 DSP 伺服控制加载到 RAM 中*/ /*2级-调用伺服节拍(由 MPU 加载到 RAM 中) * hal.tick ();//do some work HAL.COUNTER++; //每1ms (例如20*50us=1,ms) 如果(hal.counter>=20) { SPIWriteRead (&sSPIConfig); } EALLOW; PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; EDIS; }

    
    

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

    Eyan、

    您的代码中使用的最大 TX FIFO 长度为8。

    我不确定下面突出显示的逻辑。 不应仅在发送之前的内容时填充 TX FIFO。 在下面的代码中、无论之前传输的内容是什么、您似乎都要填充8次 TX FIFO。 如果 TX FIFO 已部分传输、则只能填充剩余的 TX FIFO、而不能再次填充完整的 FIFO。 我认为您的逻辑应该与此类似。

    此致、 

      曼诺伊

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

    您好 、Manoj、

    您在某种程度上是正确的,但有一个假设是经过价阻的  ,您正在引用的函数每1ms 调用一次

     SPI 主器件 (在您显示的情况下)将开始传输,直到 FIFO 为空, 这将使其大约  为50us ...100us (频率2.5MHz.1MHz) SPI CLK。

    因此、在下一个1ms 周期中、SPI 主器件 TX FIFO 为空

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

    很抱歉、我不能听从您的意见。

    -Manoj

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

    一段时间后、我没有听到您的反馈。 此问题是否已解决?

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

    你好,Manjo,

    很抱歉,更新较晚,问题是由于植入, 因为从站侧每1ms 有两个 Untis 检索信息,这是个问题,因为会有一些 difirt (不只是偏移) 在某些情况下、SPI 从器件将无法捕获所有必需的字、因此其修复方法是仅在接收到所需的 SPI 字数时添加某种 shawo 缓冲器来重新检索。

    BR,Eyal