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.

ADS8556与TMSTMS320C6745进行SPI通讯,问如何停止SPI 发送中断事件,当其他事件发生时再开始SPI 发送中断事件

Other Parts Discussed in Thread: ADS8556

ADS8556:Serial Interface: Data Output with One Active SDO

我后来通过在SPI的形式在TMS320C6745和ADS8556之间进行通讯。为了减轻了CPU的负载,发送CR控制字和接收数据时都使用了EDMA3的方法。

发送过程遇到了问题:

ADS8556转换完成之后有BUSY信号,触发了GPIO BANK3中断(我的硬件设计是这样的),GPIO BANK3中断事件(EDMA3事件23)EDMA3事件寄存器捕获到,

传输第一个控制字中的低16位,在SPI1发送完成后,有SPI1发送中断事件(EDMA3事件19)触发第一个控制字中的高16位,如此循环下去,直到发送3个CR控制字。

是还是会产生一个SPI1发送中断事件(EDMA3事件19),进而触发控制字的发送,一直发送控制字,但是ADS8556此时还未转换完成,这样读取的数据就不正确了。
  
我需要的是在发送3个CR控制字完成后,停止发送,直到ADS8556转换完成之后产生BUSY信号,才开始新一轮的发送3个CR控制字。
即在3个控制字发送完成之后休息一段时间再发送,而不是连续的发送,请问如何实现?

  • EDMA19的Bcount设成5不行吗?SPI发送完后寄存器为空时自然会产生TX中断或EDMA事件,能做的只能是要不要去响应这个事件,按上面图应该是EDMA 19的Bcount为5, Acount为2,在5次事件后传完,产生EDMA完成中断。在完成中断里disable edma 19,那么在SPI将最后一个数送给移位寄存器时产生新的EDMA 19号事件,就没有EDMA响应它了。

  • Tony Tang:

        你好!

        在我的EDMA3中PaRAM23的Bcount = 1,Acount = 2; PaRAM19的Bcount = 5,Acount = 2。

        我做过以下两种测试:

    一、使能EDMA3通道19的完成中断,在5次事件后传完,产生EDMA3中断;然后在EDMA3中断服务程序中清除事件19的事件标志(ECR)。

             结果是EDMA3中的传输不正常。

    二、使能EDMA3通道19的完成中断,在5次事件后传完,产生EDMA3中断;然后在EDMA3中断服务程序中disable事件19(EECR)。

             由于ADS8556在每次转换完成后都要DSP发送数据过去,才会有数据回传,所以我不得不在每次转换完成后(即GPIO BANK3中断服务程序中)又enable事件19(EESR)。

             这样的结果也是EDMA3中的传输不正常。

    最后是我通过响应最后一次事件19(即第6次事件19),然后让它不向SPI1发送数据,而是完成其他一次EDMA3传输。

    这样就不会一直产生SPI1发送中断,也就不会连续的发送控制字给ADS8556,而是每次转换完成后才发送一回控制字。

    PaRAM19:

    EDMA3CC_PARAMSET->PaRAMSet[19].SRC = (((uint32_t)&AD_Parameter) + 2);
    EDMA3CC_PARAMSET->PaRAMSet[19].DST = (uint32_t)&SPI1_SPIDAT1;

    EDMA3CC_PARAMSET->PaRAMSet[19].BCNTRLD_LINK = (0 << 16) | 0x4FA0;

    PaRAM125:

    EDMA3CC_PARAMSET->PaRAMSet[125].SRC = (((uint32_t)&AD_Parameter));
    EDMA3CC_PARAMSET->PaRAMSet[125].DST = (uint32_t)&AD_offset;

    EDMA3CC_PARAMSET->PaRAMSet[125].BCNTRLD_LINK = (0 << 16) | 0x4F80;

    PaRAM124:

    EDMA3CC_PARAMSET->PaRAMSet[124].SRC = (((uint32_t)&AD_Parameter) + 2);
    EDMA3CC_PARAMSET->PaRAMSet[124].DST = (uint32_t)&SPI1_SPIDAT1;

    EDMA3CC_PARAMSET->PaRAMSet[124].BCNTRLD_LINK = (0 << 16) | 0x4FA0;

    这样设置(虽然感觉有点不正规),但是EDMA3的传输正常了,ADS8556的时序也正常了。

    SDI引脚的波形(控制字不是连续不停的发送了)

    FS的波形也正常:

    问题终于是解决了!