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.

[参考译文] CCS/TMS320F2812:SPI使能引脚不能切换

Guru**** 2331900 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/574985/ccs-tms320f2812-spi-enable-pin-does-not-toggle

部件号:TMS320F2812

工具/软件:Code Composer Studio

您好,

我正在尝试在TI DSP和ET1100 (EtherCAT从属控制器)之间建立通信。 当我连续运行代码时,SPI使能引脚没有切换。 当我设置断点时,它会切换。 这是一种非常奇怪的行为。 我不知道这种代码会在哪里出错。 请帮助我了解代码持续运行时,启用引脚未切换(因为ET1100没有回复)的原因是什么。

GPIO和SPI初始化代码如下所示

void InitGpio (void)
{

	EALLOW;
	IER = 0x0000;
	IFR = 0x0000;

	//为SPI接口
	GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0 = 1启用四个I/O引脚; //从属导入,主输出
	GpioMuxRegs.GPFMUX.bit.SPISOMIA_GPIOF1 = 1; //从输出,GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2
	= 1; //串行时钟
	GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3 = 1; //启用从属传输(同步)

	EDIS;
}


void InitSPI(void)
{

	EALLOW;
	// SPI FIFO寄存器
	SpiaRegs.SPICCR.bit.SPISWRESET=0;//重置SPI

	SpiRegs.SPICCR.bit.SPICHAR = 0x7;//字符长度=8 SpiaRegs.SPICRAST.CL=

	SP1.bit/ SPITICA.SPIRAST.SPIRAST.SPRAST_SPIRAST.SPIRAST.SPIRAST.SPIRAST.SPIRAST.SPIRAST.POL= SPICA.SPIRAST.SPIRAST.SPIRAST.SPIRAST.SPIX.SPICA.POL= SPICA.POL= SPICA.

			
				
		//主模式
	SpiaRegs.SPICTL.bit.CLK_PHASE =0;		//添加Clk wrt SPISTEA
	SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;	//启用IBInterrupt

	//ClkCfgRegs.LOSRR.ALL = 0x1;//

			SPX100 = SPX1000 = SP1000状态= SP1000状态= 0;// SP1000 = SP1000状态= SP1000
			//波特率= LSPCLK /(SPIBR+1)[LSPCLK=SYSCLK/4,默认=50m]//------------
	

	SpiaRegs.SPIFFTX.all=0xC022; 	//启用FIFO,重置它们,设置TX FIFO IntLevel =2,TXINT已禁用
	SpiaRegs.SPIFFTX.Bit.TXFFIENA =0;	//禁用TXFF INT

	SpiaRegs.SPIFFRX.all=0x006A; 	//启用FIFO,重置它们,设置RXFFIL= 10(dec)
	SpiRegs.SPIFFRX.bit.RXFFIL = 0x02;
	SpiRegs.SPIFFRX.bit.RXFFIENA = 0;//	禁用RXFF INT

	//------------
	SpiaRegs.SPIFFCT.ALL=0x00;			// FFTXDLY =0 (延迟btw Tx传输)
	SPIPREGs.SPIPRI.ALL=0x0020;			//在EmuStop SpaRegs.SPICCR.Bit.SPISWRESET=1

	;//启用

	ORFIFO SpaRegs.SPIFTX1.SPIT.FRIX.1;		SPIT.FRESRS.SP1.
	

	

SPI_READ代码(与SPI_WRITE函数类似)

void esc_read(uint16_t offset_addr, void *buf, uint16_t len, void *talevent)
{uint16_t

	i,cmd, readval, NumWords =0, j;
	uint16_t *ptr =(uint16_t *)0;
	uint16_t readphase [16];//

	

	如果fift = 1tr; f0,则可以读<+10s (ints=1ws <+10s=1ws //从TI SPI的FIFO
	一次只能读取26字节的有效负载(+4字节的地址){//
	为SPI xmission将地址cmd字节构建为16位字,
	// SPI xmits MSBIT 1st, 因此,必须交换此16b字中的字节来传输
	//读取cmd序列的字节顺序:
	//字节0:A[12:5]
	//字节1:A[4:0],110b			(110b是3字节扩展)
	// cmd 2:A[15:13],CMD[2:0],00B	(011b是使用WS读取
	的)/字节3: FFH						(等待状态)
	//cmd = offset_addr & 0x1f

	cmd =(offset_addr & 0x1FE0)<<3;// offset_addr[12:5]是第一个地址
	
	阶段字节,转换为第一个字节cmd ||((offset_addr & 0x1F)<3)| CAT_EtherCAT_3BYTEADDR_3DR_readWords <10_EF10+
	
	
	

	对于(i=2, j =0;j<len; i++)//数值以字节数表示;
	{
		readphase [i]=(uint16_t) ESC_EtherCAT_CONTINUE;
		NumWords++;
		j++;
		j++;
	}
	readphase [--i]||(TS_EtherCAT_RDMINESC);//将最后一个字节设置为0xFF

	/*禁用状态*/
	

	
	
		
		
		状态= 1.FFI;<= 1= 1= 1=状态(TS_BUFF1=) STETOOT_UT_UTSTEATFSTECAT_ULATF_RDMINEST_STEF1=) STEFF1=
		SpiaRegs.SPITXBUF =((readphure[I]&(0xFF))<8);
	}

	CPU_DELAY _US(5);
	j =长;


	while (SpiaRegs.SPIFFRX.bit.XBFFST <j);
	readval =(SpiaRegs.SPIRUF)& 0xFF;//
	
		spanal =读取前
	的spabyte_readvf; spalf=0x1f_readvf=(readf) //读取talevent
	*(PTR)|=((readval & 0xFF)<8);
	CPU_DELAY _US(2);	//读取下一字节前延时

	= SpiaRegs.SPIRXBUF;//忽略
	CPU_DELAY _US(2);	//读取下一字节
	前延时= SpiaRegs.SPIRXBUF;//
		


	f= spirt (f)= f; spirxf=1= f; f; f= f; f; fxf=f; f= f; f; f= f; f=f; f; fx= f; f; f= f; f= f; f; f= f; f; fx= f; f; f= f; f; f= f; f; f; f= f; f; f; f= f; f;
		
	{

			高级=(SpiaRegs.SPIRXBUF)& 0xFF;
			PTR[I]=(readval & 0xFF);

			CPU_DELAY _US(2);	//读取下一字节前的延迟

			高级=(SpiaRegs.SPIRXBUF)& 0xFF;
			PTR[I]|=((readval & 0xFF)<8)

	


	SpiaRegs.SPIFFRX.Bit.RXFIFORESET =0;//重置FIFO指针
	SpiaRegs.SPIFFRX.Bit.RXORESET =1;//重新启用FIFO操作

	/*启用中断*/
	EINT;


	}


 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Raghu

    通常,如果您使用FIFO,SPISTE将不会在字词之间切换。 SPISTE仅在最后一次传输完成且FIFO中不再保留任何字词时切换。 如果您需要SPISTE在单词之间切换,您有几个选择:
    1.请勿使用FIFO,并通过监控SPI_INT信号等待完整的字词传输。 等待SPI_INT将保证该字已完全传输,从而使SPISTE返回HIGH。
    2.仍在使用非FIFO模式,并等待SPI_INT标志。 您可以使用GPIO作为启用信号,而不是依赖SPI来切换STE。 这些将显式写入启用状态,允许您完全控制。

    谢谢!
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    也许我本应该更清楚地说明这一点。 我的意思是SPISTE根本不切换! 不是每一个字都有。 我的意思是它永远不会切换。 代码对我来说非常好。 我不知道是否有一些与时间有关的问题。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Raghu

    您能否验证GPIO Mux设置?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Raghu

    您是否能够解决您看到的问题? 如果您有,请发布您的解决方案,以便其他人可以从您的经验中学习。 如果您没有,请发布其他问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我已经解决了这个问题。 但这是非常意外的事情。 我必须增加连续字节读取之间的延迟。 目前,我使用CPU_DELAY已有2秒,但在整个代码中,我将其更改为5秒。 系统稳定运行的最短延迟时间是5 us。 我还认为这是因为我使用物理布线作为DSP SPI和ET1100 SPI之间的连接。 物理布线也会产生一定的延迟。 但是,如果有人知道计算电线之间延迟的理论方法,请在此更新。 我想确认是否是这种情况。

    我注意到的另一个问题是,当我将SPI速度(波特率)降低到大约每秒2Mb以下时,系统将再次出现故障。 这一问题尚未解决。 但是我选择忽略它,因为我目前打算提高SPI的速度,而不是降低速度。
    我仍在探讨发生这种情况的原因。 但从理论上讲,我认为原因是DSP作为主控制器生成的SPI时钟没有一致的占空比。 有的周期占空比为50 % ,然后有的周期不是50 % (技术上称为占空比失真或占空比抖动或简单的定时抖动)。 我也想听听其他人对此的看法。