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.

TMS570 SPI/MibSPI 功能区别

Other Parts Discussed in Thread: HALCOGEN

你好,

我接触TMS570芯片后,发现它的很多外设与我之前接触的ARM CPU不同的地方,多了Multi-buffered模式,比如MibAD、MibSPI。

以SPI为例,标准SP的I操作方式比较熟悉,通过主机CLK信号控制SIMO、SOMI的数据传输,发送/接收通过SPIDAT0、SPIBUF;那么MibSPI模式有什么加强功能?操作方法有什么区别?

另,如果我想实现2个MCU(或CPU与FPGA等)之间的SPI通信,按固定的通信周期通信,通信数据约几十字节,标准SPI模式或MibSPI模式,如何选择?哪种更适合?

谢谢。

  • 你好,

      MIBSPI相对于标准SPI来说,功能上差别不是很大,简单点说就是增加了一个buffer,同时支持transfer group的工作方式。同时MIBSPI可以工作在标准SPI的模式,他们的管脚定义都是一模一样的。

            针对于你的应用,需要实现2个MCU进行通信,通信的数据时十几个字节,我建议你还是采用MIBSPI的工作方式。因为在这种大数据吞吐量的工作模式下,MIBSPI会比SPI的性能更好。

    Ken

  • Hi Liang,

    MibSPI在标准SPI模式工作时,可以通过SPIDATA0来发送数据,但还是建议你使用SPIDATA1来发送,因为在SPIDATA1中可以配置一起数据格式。

    在MibSPI模式下,与标准SPI相比,有一个传输组的概念( TG),也就是你可以事先配置好发送的传输组、接收的传输组,这样可以连续发送和接收多个数据,对于多字节的数据通讯很有帮助。此外,TG除了可以用软件也控制发送,还可以由硬件的一些事件来触发传输。另外,MibSPI还支持DMA。

    更详细的说明,请参考TRM。

    Regards,

    Jay

  • 多谢解答。

    另,目前我在用标准SPI方式调试。关于SPI的“接收/发送中断”有些疑惑:

    使用HalCoGen工具时,发现SPI2模块的中断使能TXINT和RXINT只能二者择其一,中断线可以自由选择Low Level/High Level。由此引起我对接收/发送中断的疑问。我的理解如下:

    发送中断使能后,在TXINTFLG置1后产生中断,即TXBUF为空的时间点(=数据刚移到shift Register=移位操作前):在中断函数里将源数据写入DAT1;

    接收中断使能后,在RXINTFLG置1后产生中断,即数据被移到SPIBUF的时间点(=移位操作后):在中断函数里将接收数据写入目标数据区。

    以主机为例,虽然发送数据的同时也接收从机数据,但从时间上来看,主机的接收中断和发送中断产生的时间点应该是不同的,所以发送/接收中断可以选择同一条中断线,High Level或Low Level。

    不知道上面的理解是否正确?那么,HalCoGen工具为什么只能二者择其一呢?

    一般来讲,RXINT、TXINT和其他中断的中断线如何选择更合适?哪个为level 0,哪个为level 1?

    多谢。

  • 你好,请问怎样用两个mibspi通信,有没有例子啊 ,发我一份谢谢!

  • HalcoGen里好像有例程吧?而且它会自动生成一些基本函数的,可以参考。

  • 我用的RM950的开发板,用mibspi与两个CPU通信时,发现数据一直不能发送成功。我是用halcogen生成的代码。

    //master

    void main(void)
    {
    /* USER CODE BEGIN (3) */
    uint16 tx[10] = {1,2,3,4,5,6,7,8,9,10};
    uint16 rx[10] = {0};

    mibspiInit();
    //mibspiGetData(mibspiREG5,0,&data[0]);

    //mibspiEnableLoopback(mibspiREG1,Analog_Lbk);
    mibspiSetData(mibspiREG5 0, tx);

    mibspiTransfer(mibspiREG5, 0);

    while(!(mibspiIsTransferComplete(mibspiREG5,0)));

    mibspiGetData(mibspiREG5,0,rx);

    while(1);
    /* USER CODE END */
    }

    //slave

    void main(void)
    {
    /* USER CODE BEGIN (3) */

    uint16 rx[10] = {0};

    mibspiInit();

    while(1){

    mibspiGetData(mibspiREG5,0,rx);

    }

    while(1);
    /* USER CODE END */
    }

    一直接收不到数据啊!!!!真急人主要帮我看看slave的接收函数是否正确????????感激涕零!!!!!!!!

  • ron,

    salve端的函数不能单单只用一个接收函数。

    另外需要加入mibspiSetData()和mibspiTransfer()。同时接收之前还需要加入类似于while(mibspiIsTransferComplete(mibspiREG1, 0)==1)的条件判断语句,不然接收端数据时不会成功的。



    Ken

  • //master

    void main(void)
    {
    /* USER CODE BEGIN (3) */
    uint16 tx[8] = {0xAAAA,0xAAAA,0xAAAA,0xAAAA,0xAAAA};
    uint16 rx[8] = {0};
    mibspiInit();

    mibspiSetData(mibspiREG5,0,tx);
    mibspiTransfer(mibspiREG5,0);


    while(mibspiIsTransferComplete(mibspiREG5,0) ==FALSE)
    {
    ;
    }

    mibspiGetData(mibspiREG5,0,rx);

    while(1);
    /* USER CODE END */
    }

    //slave

    void main(void)
    {
    /* USER CODE BEGIN (3) */
    uint16 tx[16] = {1,2,3,4,5,6,7};
    uint16 rx[16] = {0};

    mibspiInit();

    mibspiSetData(mibspiREG5,0,tx);
    mibspiTransfer(mibspiREG5,0);

    while(mibspiIsTransferComplete(mibspiREG5,0)==FALSE )//让从等待
    {
    ;
    }

    mibspiGetData(mibspiREG5,0,rx);

    while(1);
    /* USER CODE END */

    }

    还是接收不到数据啊????急人,,,谢谢

  • Hi ron,

    两个方面需要再确认一下:

    1. 硬件连线方面,MOSI和MOSI相连,MISO和MISO相连,CS和CLK连好。另外注意CS具体选了哪根信号线,在主机和从机相应的寄存器里面都是设置对的CS信号。

    2. 主机从机发送和接收的数据长度要一致,注意编程的规范性。

    希望这些对你有点帮助

    ken

  • 现在数据能接收成功,但是只RxBuf有数据,但是缓冲ram没数据?  怎样设置接收缓冲?  谢谢!