Other Parts Discussed in Thread: HALCOGEN, TMS570LS1227
使用两个570芯片进行mibspi数据交互,一个主机,一个从机。目前根据例程能在一个芯片上实现mibspi自发自收,但是改成不是自发自收模式后,从机部分使用HAL Gode Gen不知道怎么进行配置,想配置成接收完指定数据后进入中断,另mibspi能实现全双工吗?就是发送数据的同时也收数据。期待您的回复。万分感谢。
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.
Other Parts Discussed in Thread: HALCOGEN, TMS570LS1227
使用两个570芯片进行mibspi数据交互,一个主机,一个从机。目前根据例程能在一个芯片上实现mibspi自发自收,但是改成不是自发自收模式后,从机部分使用HAL Gode Gen不知道怎么进行配置,想配置成接收完指定数据后进入中断,另mibspi能实现全双工吗?就是发送数据的同时也收数据。期待您的回复。万分感谢。
首先MIBSPI不能配置类似UART的发送或是接收中断。它的中断都是基于transfer group的。你在程序里面需要加入类似:
mibspiEnableGroupNotification(mibspiREG5,0,0);这样的语句来使能transfer group的中断操作。
关于HACLDOGEN的配置,首先作为从机,你不需要勾选master mode以及internal clock,然后在配置data format的时候,你需要根据主机的配置设置相应的波特率和数据长度;比较重要的是关于transfer group的配置,里面要选择正确的片选管脚,group的数据长度,最后就是关于MIBSPI的管脚需要用到的呃都要设置成SPI模式,而不是HGIO的模式。
谢谢
关于MIBSPI的例程,其实主从机的配置,基本差不多。你可以参考一下下面的例程:
/* USER CODE BEGIN (0) */
#include "GIO.h"
#include "mibspi.h"
#include "pinmux.h"
/* USER CODE END */
/* Include Files */
#include "sys_common.h"
#include "system.h"
/* USER CODE BEGIN (1) */
#define TG_LENGTH 8
uint16 Tx_Data_SPI_1[8];
uint16 Tx_Data_SPI_2[8];
uint16 Tx_Data_SPI_3[8];
uint16 Rx_Data_SPI_1[8];
uint16 Rx_Data_SPI_2[8];
uint16 Rx_Data_SPI_3[8];
/* USER CODE END */
/** @fn void main(void)
* @brief Application main function
* @note This function is empty by default.
*
* This function is called after startup.
* The user can use this function to implement the application.
*/
/* USER CODE BEGIN (2) */
/* USER CODE END */
void main(void)
{
/* USER CODE BEGIN (3) */
uint8 i;
muxInit();
gioInit();
mibspiInit();
mibspiEnableGroupNotification(mibspiREG1,0,0);
// mibspiEnableGroupNotification(mibspiREG1,0,1);
// mibspiEnableGroupNotification(mibspiREG1,0,2);
_enable_IRQ();
Tx_Data_SPI_1[0] = 0x0011;
Tx_Data_SPI_2[0] = 0x0021;
Tx_Data_SPI_3[0] = 0x0031;
for(i=1;i<TG_LENGTH;i++)
{
Tx_Data_SPI_1[i] = Tx_Data_SPI_1[i-1]+1;
Tx_Data_SPI_2[i] = Tx_Data_SPI_2[i-1]+1;
Tx_Data_SPI_3[i] = Tx_Data_SPI_3[i-1]+1;
}
mibspiSetData(mibspiREG1,0,Tx_Data_SPI_1);
// mibspiSetData(mibspiREG1,1,Tx_Data_SPI_2);
// mibspiSetData(mibspiREG1,2,Tx_Data_SPI_3);
mibspiTransfer(mibspiREG1,0 );
// mibspiTransfer(mibspiREG1,1 );
// mibspiTransfer(mibspiREG1,2 );
while(1)
{
// while(mibspiIsTransferComplete(mibspiREG1, 0)==1)
// {
// mibspiGetData(mibspiREG1, 0, Rx_Data_SPI_1);
// }
}
/* USER CODE END */
}
/* USER CODE BEGIN (4) */
void mibspiGroupNotification(mibspiBASE_t *mibspi, uint32 group)
{
/* enter user code between the USER CODE BEGIN and USER CODE END. */
switch(group)
{
case 0:
mibspiGetData(mibspiREG1, 0, Rx_Data_SPI_1);
break;
case 1:
mibspiGetData(mibspiREG1, 1, Rx_Data_SPI_2);
break;
case 2:
mibspiGetData(mibspiREG1, 2, Rx_Data_SPI_3);
break;
default:
break;
}
}
谢谢
您好!我还是没有调试成功,从机的设置没有勾选master mode以及internal clock,data format的配置跟主机一样,transfer group选的CS_NONEKen Wang 说:首先MIBSPI不能配置类似UART的发送或是接收中断。它的中断都是基于transfer group的。你在程序里面需要加入类似:
mibspiEnableGroupNotification(mibspiREG5,0,0);这样的语句来使能transfer group的中断操作。
关于HACLDOGEN的配置,首先作为从机,你不需要勾选master mode以及internal clock,然后在配置data format的时候,你需要根据主机的配置设置相应的波特率和数据长度;比较重要的是关于transfer group的配置,里面要选择正确的片选管脚,group的数据长度,最后就是关于MIBSPI的管脚需要用到的呃都要设置成SPI模式,而不是HGIO的模式。
谢谢
,主从机都没有勾选user encode select,长度都选择的128字,triger event选的triger_always, triger source选的triger_disabled.从机将VIM channel中的mibspi1 high中断勾选上了。程序就按照您给例程写的,主从机都收不到数据,也不进中断。求指教!
另,从机除了调用mibspiEnableGroupNotification(mibspiREG1,0,0);和函数mibspiSetData()之外,还需要写mibspiTransfer()函数吗?
您好! mibspi模式可以不使用ENA管脚吗?目前此管脚是设置成gpio口了,求解答,万分感谢Ken Wang 说:首先MIBSPI不能配置类似UART的发送或是接收中断。它的中断都是基于transfer group的。你在程序里面需要加入类似:
mibspiEnableGroupNotification(mibspiREG5,0,0);这样的语句来使能transfer group的中断操作。
关于HACLDOGEN的配置,首先作为从机,你不需要勾选master mode以及internal clock,然后在配置data format的时候,你需要根据主机的配置设置相应的波特率和数据长度;比较重要的是关于transfer group的配置,里面要选择正确的片选管脚,group的数据长度,最后就是关于MIBSPI的管脚需要用到的呃都要设置成SPI模式,而不是HGIO的模式。
谢谢
为什么从机的片选要选择CS_None呢?你的SPI通信没有选择CS管脚吗?
中断VIM你要选择12 channel吧。从机还需要写mibspiTransfer(),因为这个是使能transfer group的,不是发送函数。
谢谢
您好!我现在中断VIM是选择的12 channel,CS选择的CS_4,硬件是连的CS_4,从机写了mibspiTransfer()函数。主从机一样的设置有:Buffer Mode选择的4,选了Enable WDELAY,没选chip Select Hold,没选use Encode chip select ,都选了oneshot transfer ,长度选了127,TRG_ALWAYS,TRG_DISABLED,没选Transfer Group Pointer Reset,没选 Enable pin HIGHZ,没选Enable Ram Parity,波特率都1M。管脚配置除了ENA未使用选了GPIO模式,其他管脚都是默认的非gpio口模式。主机的CS_4是输出模式,从机的CS_4是输入模式。Ken Wang 说:为什么从机的片选要选择CS_None呢?你的SPI通信��有选择CS管脚吗?
中断VIM你要选择12 channel吧。从机还需要写mibspiTransfer(),因为这个是使能transfer group的,不是发送函数。
谢谢
但还是没有调通!!麻烦再看看还有哪里的设置不对。
另,我做了一些测试,第一个测试,主从配置不变,从机在mibspiSetData()函数后面添加了一个函数,给SpiDAT1里填一个数0x5678,结果是主机收到了0x5678,从机收到了一个字的主机发送的数,其他的都没收到。
第二个测试,主机设置和程序不变,即还是配置成mibspi模式,将从机配置成spi模式,使用RxInt和TxInt收发数据,这样主从机收发的数据都正常。
麻烦了!谢谢!
你设置SpiDAT1,这个是用作SPI兼容模式下面的,不是MIbspi模式的。两者的差别在于前者是我们常用通用SPI,发送缓存和接收缓存基本都是两个字节的,后者是可以设置大容量缓存的。
我发两个参考例程你看下。

谢谢
假如主从机都配置成spi模式,这样可以DMA实现多字节数据一起发送接收吗?
你硬件连线上面没错吧。
MISO接MISO,MOSI接MOSI。另外需要确定的是,在HALCOGEN里面的pinmux里面看下你选用的MIBSPI有没有管脚冲突的。
如果是用标准SPI模式的,你用DMA硬件上识别不了多字节传输发送。不过你可以自己定义一个全局变量数组,先把SPI接收到的数据保存在那里面,然后设置DMA的源地址是这个数组,这样可以软件实现DMA多字节传输。
谢谢
对的, 从机只需要调用一下mibspiTransfer(), 关于SPI通信,有一个要注意的是,你的从机的数据必须的在主机发起通信之前就准备好。
另外,如果方便的话,把你的mibspi.c发出来,我帮你看一下。
谢谢
我们的电脑有加密,文件拷不出来,没法给您看。我拿示波器测试了一下管教信号,SIMO和CLK信号正常;SOMI没有信号,一直低电平;CS_4管脚有被拉低几次,但感觉波形不是很对,mibspi1的CS_4管脚可以用的吧??我看手册上写的CS[3:0]有效?Ken Wang 说:对的, 从机只需要调用一下mibspiTransfer(), ��于SPI通信,有一个要注意的是,你的从机的数据必须的在主机发起通信之前就准备好。
另外,如果方便的话,把你的mibspi.c发出来,我帮你看一下。
谢谢
管脚配置有可能有问题,你可以打开你的HALCOGEN配置文件,在pinmux那个页面下面选择mibspi1,然后选择你用到的那几个管脚。
或者你把MIBSPI.c文件复制黏贴发一下。
谢谢