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.

[参考译文] TMS320F28379D:与 ads7254的 SPI 通信无响应

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/879832/tms320f28379d-spi-communication-with-ads7254-is-not-responding

器件型号:TMS320F28379D
主题中讨论的其他器件: ADS7254

尊敬的先生/女士:  

我使用的是 ADs7254外部 ADC 以及使用 SPI 的 LaunchPad TMS320F28379D。 我已经尝试了回送示例、并且工作正常。 但是、当我使用 ADC 加载配置时、我会在"SpiaRegs.SPIRXBUF"寄存器中读取"0"。  DSP 处于主模式、SPI 时钟为500kHz。  

我没有在 SPISOMI 上接收任何数据、只要有时钟、我就一直读取0。 当时钟不存在时、它会变为高电平。 此外,两个 SPI 通道之间存在延迟,我不明白为什么?

我在 SPI 配置下连接。  我还尝试发送到 ADC 0x0800而不是0x8800、因为我想在 16-CLK、双 SDO 模式(CFR.B11 = 1、CFR.B10 = 0)下工作、但我始终读为0。  

谢谢你。  

#define SPI_BRR     ((200E6 / 4)/ 500E3)- 1.

//=================== SPI - A =================================
//========================================================================================
//Init GPIO SPIA
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//启用 GPIO16上的上拉
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//启用 GPIO17上的上拉
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//启用 GPIO18上的上拉
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;//启用 GPIO19上的上拉

GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//异步输入 GPIO17
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//异步输入 GPIO18
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;//异步输入 GPIO19

GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//将 GPIO16配置为 SPI
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3;

GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;//将 GPIO17配置为 SPI
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;//将 GPIO18配置为 SPI
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3;//将 GPIO19配置为 SPI

GpioCtrlRegs.GPBDIR.bit.GPIO58 = 1;
GpioCtrlRegs.GPBDIR.bit.GPIO59 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO60=1;
GpioCtrlRegs.GPBDIR.bit.GPIO61=1;

//=================== SPI - B =================================
//=========== 初始化 GPIO SPIB ===================


GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;//启用 GPIO24上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;//启用 GPIO25上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;//启用 GPIO26上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;//启用 GPIO27上的上拉

GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3;//异步输入 GPIO24
GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3;//异步输入 GPIO25
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;//异步输入 GPIO26
GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;//异步输入 GPIO27

GpioCtrlRegs.GPAGMUX2.bit.GPIO24=1;//配置 GPIO24
GpioCtrlRegs.GPAGMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAGMUX2.bit.GPIO26 = 1;
GpioCtrlRegs.GPAGMUX2.bit.GPIO27 = 1;

GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 2;//作为 SPI
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 2;//将 GPIO25配置为 SPI
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 2;//将 GPIO26配置为 SPI
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 2;//将 GPIO27配置为 SPI

GpioCtrlRegs.GPADIR.bit.GPIO24 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO25 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO26 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO27 = 1;
EDIS;

void SPI_init (){


//Init SPI A
SpiaRegs.SPICCR.bit.SPISWRESET=0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//输出上升沿,输入被锁存下降沿
SpiaRegs.SPICCR.bit.HS_MODE = 0;//高速模式禁用
SpiaRegs.SPICCR.bit.SPICHAR=15;
SpiaRegs.SPICCR.bit.SPILBK=0; //Loopback Disable (测试模式)
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICTL.bit.SPIINTENA=0;
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;
SpiaRegs.SPICCR.bit.SPISWRESET=1;

//Init SPI B
SpibRegs.SPICCR.bit.SPISWRESET=0;
SpibRegs.SPICCR.bit.CLKPOLARITY = 0;//输出上升沿,输入被锁存下降沿
SpibRegs.SPICCR.bit.HS_MODE = 0;//高速模式禁用
SpibRegs.SPICCR.bit.SPICHAR=15;
SpibRegs.SPICCR.bit.SPILBK=0; //Loopback Disable (测试模式)
SpibRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpibRegs.SPICTL.bit.TALK = 1;
SpibRegs.SPICTL.bit.CLK_PHASE = 0;
SpibRegs.SPICTL.bit.SPIINTENA=0;
SpibRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;
SpibRegs.SPICCR.bit.SPISWRESET=1;


}

__interrupt void epwm1_ISR (void)
{
SpiaRegs.SPITXBUF = 0x8800;
SpibRegs.SPITXBUF = 0x8800;

while (! SpiaRegs.SPISTS.bit.INT_FLAG ){}
SPI_A = SpiaRegs.SPIRXBUF;
while (! SpibRegs.SPISTS.bit.INT_FLAG ){}
SPI_B = SpibRegs.SPIRXBUF;

} 

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

    Vidhi、

    根据提供的输入、我相信您只是想在 SPICLK 的下降沿读取 ADC 结果是正确的吗?

    查看 ads7254 DS、您需要执行以下操作:-

    1) 1)写入 CFR = 0x8800以选择16-CLK、Dual-SDO 模式)、这将允许您选择 SDO_A 输出 ADCA 结果、SDO_B 输出 ADCB 结果

    - FRC.B15:B12 = 8对应于 CFR 写入寄存器

    - FRR.B11 = 1 (设置 RD_CLK_MODE = 16-CLK 模式)

    - FRC.B10 = 0 (选择双 SDOMode)

    因此、F28379D.SPI 需要配置为主器件并发送0x8800

    2) 2)为 ADS7254提供虚拟传输、以使 ADS7254将 ADC 结果发送回主器件

    虚拟传输可通过将0x000写入 SPITXBUF 寄存器来启动。 在这个虚拟 SPI 传输之后、你可以预计在 SPIRXBUF 中有 ADC 结果。

    在您的代码中、您要转寄0x8800两次、这实际上会配置 CFR 寄存器两次。 请尝试执行上述虚拟 SPI 传输。

    我还建议您使用逻辑分析仪/示波器监控 SPI 总线。

    希望这对您有所帮助。

    此致、

    曼诺伊

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

    感谢您的回答。  

    是的、我正在读取 ADC 值。 我将向 ADC 发送0x8800。 我正在监控 SPI 总线、它们看起来是正确的。  

    当我观察到 SOMI 时、如所附图片所示、当有时钟时、它为0。 如您所述、发送虚拟数据时会拍摄照片。 但它与发送0x8800时相同。  

    我 没有  传输0x8800两次、但我使用2个通道 SPIA 和 Spib。 我更改了 DSP、但响应相同、ADC 也使用 FPGA、但当然在不同的模式下。  

    我不明白、接下来我将检查什么。    

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

    您好、Vidhi、

    CFR 寄存器值0x8800是使用第一篇文章中提到的所需设置写入寄存器的正确值。 但是、ADS7254在加电时默认为32位时钟双 SDO 模式。 要更改模式、第一个命令必须满足表3中所示的32时钟最小要求。

    在第一个帧中、通过用0x0000填充0x8800、将该帧扩展到至少32个 SCLK 下降沿。  

    您还提到、当 SCLK 停止时、ADS7254上的 DOUT 变为高电平。 我想此时/CS 也会升高吗? 当/CS = 1时、接口被禁用、DOUT 进入高电平不受电压干扰的三态输出。 共享同一 DOUT 线路的其他器件可能会将该引脚拉高、但我认为这还不是问题。

    此致、

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

    您好、先生、  

    感谢你的答复。 我不熟悉 SPI,因此如何第一次使用 FIFO 传输32位?

    因为 SPI 只能发送16位。

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

    您好、Vidhi、

    您是说 SPI 外设只能支持16位帧还是16位字大小? 我对 TMS320F28379D 还不是很熟悉 、不知道支持的帧长度是多少、但我想可以在一个帧中发送两个以上的字节(通过"帧"、我是指/CS = 0和/CS = 1之间的通信)。 如果您发现 SPI 外设始终在每16位后复位/CS、并且无法在单个帧中发送32位、我建议您使用您根据需要设置为高电平/低电平的专用 GPIO 引脚手动控制/CS。  

    MANOJ -您能否确认 SPI 帧是否可以扩展到16位以上、并解释如何为 Vidhi 执行此操作?

    此致、

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

    您好!

    我将 GPIO60更改为 GPIO56、并从 ADC 读取正确的值、但有时我可以读取、大部分时间不能读取 因此、我决定按照您的建议、做 Ryan。   

    该时钟为48个脉冲、采用以下 DMA 配置。 因此、我不认为 SPI 在每16位后复位。  

    我意味着一次1-16位。 我看到了 DMA 示例、并尝试了以下代码。 但是、由于我必须发送第一个32位的帧、因此我应该像在代码中一样进行设置。  

    现在、问题在于我应该读取哪个寄存器来查看发送主器件的 ADC、因为"SpiaRegs.SPIRXBUF"为0。  

    此外、请告诉我出错的地方。 我正在 SOMI 上接收一些内容、并在我更改传感器电压时进行更改、但如何确认其发送的内容是否正确。  

    //######################################################################################################################
    //
    ////文件:example_2837xDSpi_FFDLB.c
    //
    //标题:SPI 数字环回程序。
    //
    //! addtogroup cpu01_example_list
    //! 

    SPI 数字回路(SPI_LOOP)

    //! //! 该程序使用外设的内部回路测试模式。 //! 除引导模式引脚配置外、无其他硬件配置 //! 要求。 不使用中断。 //! //! 发送数据流、然后与接收到的数据流进行比较。 //! 发送的数据如下所示:\n //! 0000 0001 0002 0003 0004 0005 0006 0007… FFFE FFFF \n //! 这种模式会一直重复。 //! //! b 监视\b 变量\n //! -\n sdata -已发送数据 //! -\b RDATA -接收到的数据 //! // //########################################################################################################################## //$TI 发行版:F2837xD 支持库 V200 $// $发行 日期:星期二6月21日13:00:02 CDT 2016 $// 版权所有:版权所有(C) 2013-2016德州仪器(TI)公司-// http://www.ti.com/ 保留所有权利$ //############################################################################################################ // //包含的文件 // #include "F28x_Project.h" #define burst (FIFO_LVL-1)//突发大小应小于8 #define 传输 0 //[(MEM_buffer_size/FIFO_LVL)-1] #define FIFO_LVL 3. // FIFO 中断级别 #pragma DATA_SECTION (sdata、"ramgs0");//将 TX 数据映射到存储 器#pragma DATA_SECTION (RDATA、"ramgs1");//将 RX 数据映射到存储器 UINT16 sdata[4]; //发送数据缓冲 器 uint16 RDATA[4]; //接收数据缓冲 器 UINT16 SPI_A[4]; UINT16 RDATA_POINT;//跟踪我们的位置 //在数据流中检查接收到的数据 易失性 uint16 * DMADest; 易失性 uint16 * DMASource; 易失性 uint16 Done; int i=0、Mario; // 函数原型 // _中断 void local_D_intch5_isr (void); __interrupt void local_D_intch6_isr (void); void (void);void (void);void (void) void error(); void SPI_init (void); void Init_Pie (void); void SPI (void); //全局变量(用于读取寄存器) float SPI_b_1; int init =0;void main (void){InitSysCtrl();InitGpio();SPI_init (); //初始化 SPI Init_Pie (); IER = 0x0000; IFR = 0x0000; //清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 DINT; InitPieCtrl(); //禁用 CPU 中断并清除所有 CPU 中断标志: IER = 0x0000; IFR = 0x0000; InitPieVectTable (); EALLOW;//这是写入 EALLOW 受保护寄存器所必需的 PieVectTable.DMA_CH5_INT=&LOCAL_D_INTCH5_ISR; PieVectTable.DMA_CH6_INT=&LOCAL_D_INTCH6_ISR; EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的 dma_init(); //为 SPI 配置设置 DMA SPI_Fifo_init(); //仅初始化 SPI EALLOW; CpuSysRegs.SECMSEL.bit.PF2SEL = 1; EDIS; ERTM; PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //启用 PIE 块 PieCtrlRegs.PIEIER7.bit.INTx5 = 1;//启用 PIE 组7、INT 1 (DMA CH1) PieCtrlRegs.PIEIER7.bit.INTx6 = 1;//启用 PIE 组7、INT 2 (DMA CH2) IER = M_INT7; //启用 CPU INT6 EINT; //启用全局中断 for (i=0;i<4;i++) { sdata[0]= 0x8800; sdata[1]= 0x0000; sdata[2]= 0x8800; sdata[3]= 0x0000; } RDATA_POINT = 0; for (;;) { 马里奥++; // //初始化数据缓冲区 // StartDMACH6(); //启动 SPI RX DMA 通道 StartDMACH5(); //启动 SPI TX DMA 通道 完成= 0; //尚未完成测试 while (!done); //等待 DMA 传输完成 //完成 SPI(); } } // // delay_loop -用于添加 delay // void delay_loop() { 长 I; 对于(i = 0;i < 1000000;i++){} // 错误-收到错误时停止调试 器// void 错误(void) { asm (" ESTOP0");//测试失败!! 停下来! 对于(;;); } // SPI_Fifo_init -初始化 SPIB FIFO // void SPI_Fifo_init () { // //初始化 SPI FIFO 寄存器 // SpiaRegs.SPIFFRX.All=0x2040; //启用 RX FIFO,清除 FIFO 内部 SpiaRegs.SPIFFRX.bit.RXFFIL = FIFO_LVL;//设置 RX FIFO 电平 SpiaRegs.SPIFFTX.All=0xE040; //启用 FIFO、释放 TX FIFO、 SpiaRegs.SPIFFTX.bit.TXFFIL = FIFO_LVL;//设置 TX FIFO 电平 // //初始化内核 SPI 寄存器 // SPI_INIT(); } // dma_init - TX 和 RX 通道的 DMA 设置。 // void dma_init() { // //初始化 DMA // DMAInitialize(); DMASource =(volatile UINT16 *) sdata; DMADest =(易失性 UINT16 *) RDATA; // //为 TX 配置 DMACH5 // DMACH5AddrConfig (SpiaRegs.SPITXBUF、DMASource); DMACH5BurstConfig (突发、1、0); //突发大小、src 步长、dest 步长 DMACH5TransferConfig (transfer、1、0);//传输大小、src 阶跃、dest 阶跃 DMACH5ModeConfig (DMA_SPIATX、PERINT_ENABLE、OneShot_disable、CONT_disable、 SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、十六位、 Chint_end、CHINT_ENABLE); // //为 RX 配置 DMA CH2 // DMACH6AddrConfig (DMADest、SpiaRegs.SPIRXBUF); DMACH6BurstConfig (突发、0、1); DMACH6TransferConfig (传输、0、1); DMACH6ModeConfig (DMA_SPIARX、PERINT_ENABLE、OneShot_disable、CONT_disable、 SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、十六位、 CHINT_END、CHINT_ENABLE); } // local_D_INTCH5_ISR - DMA 通道5 ISR // _interrupt void local_D_INTCH5_ISR (void) { EALLOW;//需要在 ISR 内执行 EALLOW!!! DMARegs.CH5.CONTL.BIT.HALT=1; PieCtrlRegs.PIEACK.all = PIEACK_group7;// ACK 以接收更多中断 //来自此 PIE 组 EDIS; 返回; } // //// local_D_INTCH6_ISR - DMA 通道6 ISR // __interrupt void local_D_INTCH6_ISR (void) { uint16 i; EALLOW;//需要在 ISR 内执行 EALLOW!!! DmaRegs.ch6.control.bit.halt = 1; PieCtrlRegs.PIEACK.all = PIEACK_group7;// ACK 以接收更多中断 //来自此 PIE 组 EDIS; for (i = 0;i<4;i++) { // //检查数据完整性 // /* if (RDATA[i]!= i) { error(); }*/ SPI_A[i]= RDATA[i]; } DONE = 1;//测试完成。 return; } void SPI_init(){ EALLOW; //=================== SPI - B ================================= //======================================================================================== //初始化 GPIO SPIB GpioCtrlRegs.GPBPUD.bit.GPIO56 = 1;//禁用 GPIO22上的上拉电阻 GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;// GpioCtrlRegs.GPBGMUX2.bit.GPIO56=0;//配置 GPIO22 GpioCtrlRegs.GPBMUX2.bit.GPIO56=1; GpioCtrlRegs.GPBDIR.bit.GPIO56=1;// GpioCtrlRegs.GPBPUD.bit.GPIO58 = 1;//禁用 GPIO23上的上拉 GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入 GPIO23 GpioCtrlRegs.GPBGMUX2.bit.GPIO58=3; GpioCtrlRegs.GPBMUX2.bit.GPIO58=3;//配置 GPIO23 GpioCtrlRegs.GPBDIR.bit.GPIO58=1; GpioCtrlRegs.GPBPUD.bit.GPIO59 = 1;//禁用 GPIO24上的上拉电阻 GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//异步输入 GPIO24 GpioCtrlRegs.GPBGMUX2.bit.GPIO59 =3; GpioCtrlRegs.GPBMUX2.bit.GPIO59 =3;//配置 GPIO24 GpioCtrlRegs.GPBDIR.bit.GPIO59 =0; GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;//禁用 GPIO25上的上拉电阻 GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;//异步输入 GPIO25 GpioCtrlRegs.GPBGMUX2.bit.GPIO61=3; GpioCtrlRegs.GPBMUX2.bit.GPIO61=3;//配置 GPIO25 GpioCtrlRegs.GPBDIR.bit.GPIO61=1; // 0:将引脚配置为输入。 // 1:将引脚配置为输出。 //初始化 SPI-A //在配置更改之前将 RESET 设置为低电平 //时钟极性(0 =上升、1 =下降) // 16位字符 //启用环回 SpiaRegs.SPICCR.bit.SPISWRESET = 0; SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; SpiaRegs.SPICCR.bit.SPICHAR =(16-1); SpiaRegs.SPICCR.bit.SPILBK = 1; //启用主设备(0 =从设备,1 =主设备) //启用传输(TALK) //时钟相位(0 =正常、1 =延迟) //禁用 SPI 中断 SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; SpiaRegs.SPICTL.bit.TALK = 1; SpiaRegs.SPICTL.bit.CLK_PHASE = 0; SpiaRegs.SPICTL.bit.SPIINTENA=0; //设置波特率 SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR; //设置空闲位 //在断点上停止不会停止 SPI SpiaRegs.SPIPRI.bit.FREE = 1; //解除 SPI 复位 SpiaRegs.SPICCR.bit.SPISWRESET = 1; EDIS; } void Init_Pie (void) { Dint; //禁用 PIE PieCtrlRegs.PIECTRL.bit.ENPIE = 0; //清除所有 PIEIER 寄存器: PieCtrlRegs.PIEIER1.ALL = 0; pieCtrlRegs.PIEIFR1.all = 0; } void SPI (void){ // while (! SpiaRegs.SPIFFRX.bit.RXFFST){} // SPI_b_1= SpiaRegs.SPIRXBUF; // if (CONT=1){ SpiaRegs.SPITXBUF=0x8800; while (! SpiaRegs.SPISTS.bit.INT_FLAG ){} SPI_b_1= SpiaRegs.SPIRXBUF; } if (CONT>1){ SpiaRegs.SPITXBUF=0x0000; while (! SpiaRegs.SPISTS.bit.INT_FLAG ){} SPI_b_1= SpiaRegs.SPIRXBUF; } */ }

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

    Vidhi、

    下面的线程说明了如何一次传输32位。 读取从 ADC 接收到的 SPI 数据。 您需要等待

    RXFFINT 标志被置位、然后读取 SPIRXBUF 寄存器可被用来读取存储在 FIFO 中的结果

    此致、

    曼诺伊