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.

TMS570LS1227 的 MibSpi 从机接收数据设置

Other Parts Discussed in Thread: HALCOGEN, TMS570LS1227

使用两个570芯片进行mibspi数据交互,一个主机,一个从机。目前根据例程能在一个芯片上实现mibspi自发自收,但是改成不是自发自收模式后,从机部分使用HAL Gode Gen不知道怎么进行配置,想配置成接收完指定数据后进入中断,另mibspi能实现全双工吗?就是发送数据的同时也收数据。期待您的回复。万分感谢。

  • 从机配置成接收完指定字大小后进入中断,例如接收完128字以后进入中断

  • 急!从机的中断源选择什么?

  • Move to herculus forum

  • 首先根据SPI的协议,它在发送数据的同时,也是在接收数据的。它采用的是移位寄存器的操作方式。

    要实现自发自首,通过HALCOGEN配置就行,需要注意的是从机的配置。从机的中断可以设置为接收/发送中断,或者是可以通过添加DMA中断的方式来产生接收中断。

    谢谢

  • 能提供更详细的配置说明及代码吗?例如从机怎么配置中断,怎么配置多少字进中断?我通过HALGOGEN配置不了mibspi的接收中断,RXINT的那根线勾选不上。最好能提供一份大致的代码例程。谢谢了

  • 通过添加DMA中断方式接收数据也不会,希望能提供可参考代码。谢谢了

    Ken Wang 说:

    首先根据SPI的协议,它在发送数据的同时,也是���接收数据的。它采用的是移位寄存器的操作方式。

    要实现自发自首,通过HALCOGEN配置就行,需要注意的是从机的配置。从机的中断可以设置为接收/发送中断,或者是可以通过添加DMA中断的方式来产生接收中断。

    谢谢

  • 首先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;
    
    	}
    }

    谢谢

  • 关于MIBSPI配合DMA的操作,这个在我们的HALCOGEN的安装路径下面的examples文件夹下面有例程的。

    你可以参考一下。

    谢谢

  • 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的模式。

    谢谢

    您好!我还是没有调试成功,从机的设置没有勾选master mode以及internal clock,data format的配置跟主机一样,transfer group选的CS_NONE

    ,主从机都没有勾选user encode select,长度都选择的128字,triger event选的triger_always,   triger source选的triger_disabled.从机将VIM channel中的mibspi1 high中断勾选上了。程序就按照您给例程写的,主从机都收不到数据,也不进中断。求指教!

    另,从机除了调用mibspiEnableGroupNotification(mibspiREG1,0,0);和函数mibspiSetData()之外,还需要写mibspiTransfer()函数吗?

  • 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的模式。

    谢谢

    您好! mibspi模式可以不使用ENA管脚吗?目前此管脚是设置成gpio口了,求解答,万分感谢

  • 为什么从机的片选要选择CS_None呢?你的SPI通信没有选择CS管脚吗?

    中断VIM你要选择12 channel吧。从机还需要写mibspiTransfer(),因为这个是使能transfer group的,不是发送函数。




    谢谢

  • ENA管脚不是必须的,可以不用。它主要是用作从机有数据发送是,给主机发信号的。如果你不需要这个功能,可以不要。

    谢谢

  • Ken Wang 说:

    为什么从机的片选要选择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是输入模式。

      但还是没有调通!!麻烦再看看还有哪里的设置不对。

    另,我做了一些测试,第一个测试,主从配置不变,从机在mibspiSetData()函数后面添加了一个函数,给SpiDAT1里填一个数0x5678,结果是主机收到了0x5678,从机收到了一个字的主机发送的数,其他的都没收到。

    第二个测试,主机设置和程序不变,即还是配置成mibspi模式,将从机配置成spi模式,使用RxInt和TxInt收发数据,这样主从机收发的数据都正常。

    麻烦了!谢谢!

  • 你设置SpiDAT1,这个是用作SPI兼容模式下面的,不是MIbspi模式的。两者的差别在于前者是我们常用通用SPI,发送缓存和接收缓存基本都是两个字节的,后者是可以设置大容量缓存的。

    我发两个参考例程你看下。

    谢谢


  • 请教一下,mibspi模式,写到TX RAM里的数是什么时候写到TXBuff里呢?是TXBUFF为空就写进入一个字,不为空就停着不写,等待TXBUFF为空吗?mibspi模式还会使用SPIDAT1吗?TX RAM里的数不会再写到SPIDAT1里是吧?

    mibspi从机接收到数据数据,是什么时候从SPIBUF写到RX RAM里?

  • Ken Wang 说:

    你设置SpiDAT1,这个是用作SPI兼容模式下面���,不是MIbspi模式的。两者的差别在于前者是我们常用通用SPI,发送缓存和接收缓存基本都是两个字节的,后者是可以设置大容量缓存的。

    我发两个参考例程你看下。

    谢谢


    我根据例程里的设置重新设了一遍,但还是没有成功,疯掉了。区别是例程里用的CS_1,由于我们硬件连的CS_4, 我们用CS_4可以么?我们用的芯片是TMS570LS1227,144管脚的贴片封装。

  • 假如主从机都配置成spi模式,这样可以DMA实现多字节数据一起发送接收吗?

  • 你硬件连线上面没错吧。

    MISO接MISO,MOSI接MOSI。另外需要确定的是,在HALCOGEN里面的pinmux里面看下你选用的MIBSPI有没有管脚冲突的。

  • 如果是用标准SPI模式的,你用DMA硬件上识别不了多字节传输发送。不过你可以自己定义一个全局变量数组,先把SPI接收到的数据保存在那里面,然后设置DMA的源地址是这个数组,这样可以软件实现DMA多字节传输。

    谢谢

  • Ken Wang 说:

    你硬件连线上面没错吧。

    MISO接MISO,MOSI接MOSI。另外需要确定的是,在HALCOGEN里面的pinmux里面看下你选用的MIBSPI有没有管脚冲突的。

    主从机的spi模式是调通了的,所以硬件是没有问题的,目前的现象就像是,从机的txRAM里的数没有拷贝到TXBUFF里,或者是从机mibspi没有启动一样,确定mini版的570TMSLS1227,144管脚的,从机调用mibspiTransfer()函数就启动了吗?

  • 对的, 从机只需要调用一下mibspiTransfer(), 关于SPI通信,有一个要注意的是,你的从机的数据必须的在主机发起通信之前就准备好。

    另外,如果方便的话,把你的mibspi.c发出来,我帮你看一下。




    谢谢

  • Ken Wang 说:

    对的, 从机只需要调用一下mibspiTransfer(), ��于SPI通信,有一个要注意的是,你的从机的数据必须的在主机发起通信之前就准备好。

    另外,如果方便的话,把你的mibspi.c发出来,我帮你看一下。




    谢谢

    我们的电脑有加密,文件拷不出来,没法给您看。我拿示波器测试了一下管教信号,SIMO和CLK信号正常;SOMI没有信号,一直低电平;CS_4管脚有被拉低几次,但感觉波形不是很对,mibspi1的CS_4管脚可以用的吧??我看手册上写的CS[3:0]有效?

     

  • 管脚配置有可能有问题,你可以打开你的HALCOGEN配置文件,在pinmux那个页面下面选择mibspi1,然后选择你用到的那几个管脚。

    或者你把MIBSPI.c文件复制黏贴发一下。

    谢谢

  • Ken Wang 说:

    管脚配置有可能有问题,你可以打开你的HALCOGEN配置文件,在pinmux那个页面下面选择mibspi1,然后选择你用到的那几个管脚。

    或者你把MIBSPI.c文件复制黏贴发一下。

    谢谢

    可以给我一个邮箱吗?我把配置文件给您发过来

  • 我的邮箱是ken-wang@ti.com。

    你也可以直接发到这个帖子里面。

  • 问题已解决。证明CS_4是可以用的。只是用HALcode Generate配置时,mibspi的CS_3是灰色的,不让配置,而默认的CS_3是配置成spi模式了,不用配置界面,手动在代码里将CS_3该成GIO模式就可以了。

    感谢Ken Wang

    Ken Wang 说:

    我的邮箱是ken-wang@ti.com。

    你也可以直接发到这个帖子里面。

  • 问题已解决。CS_4可以用,mibspi1的HAL配置界面的CS_3不能配置,手动将代码里的CS_3配置成GIO模式就可以了