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芯片后,发现它的很多外设与我之前接触的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?
多谢。
我用的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