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.

[参考译文] TMS320F2.8377万S:SPIRXINT不工作SPI从属,高速时钟

Guru**** 2485015 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/616243/tms320f28377s-spirxint-not-working-spi-slave-high-speed-clock

部件号:TMS320F2.8377万S

大家好,

我正在尝试将SPIA外围设备与FIFO一起用作从属设备,以便与FPGA高速通信。  我有微控制器设置,在接收到3,8位字后跳闸SPIRXINT。  从调试器中,我可以看到RXFFINT位为真,但我也看到FIFO已完成,我的ISR未运行。  最终结果是我永远不能维修SPI外围设备。  关于为什么这不起作用的任何想法。 我在下面附上了我的配置代码和为SPI模块提供服务的例程。

void SPI_CNF (void){
//为SPI外设将SYSCLK分频器比率设置为1 => 200MHz LSPCLK设置
EALLOW;
ClkCfgRegs.LOSPPCN.bit.LSPCLKDIV = 0;
EDIS;

	//SPICCR寄存器
	SpiaRegs.SPICCR.bit.SPISWRESET = 0;
	SpiaRegs.SPICCR.bit.SPICHAR = 0x7;//8位字符
	SpaRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性(数据在上升时钟边缘输出)//SPICSTER.CL/SPICRASTER.SPICRA.CL/SPICSTA1.STA1.STA1.STAN.SPICRAL= SPICSTA1.STA1.STAN.CLK.CLKPOL/

	
	SPICSTRELASTRELASTA1.STA1.STAEL	= 0
		;SPICSTAEL与SPICSTREDA.CLKPOL.CLKPOL.CLKPOL.CLKPOL= 0
		//通过SPI
	SpiaRegs.SPICTL.bit.SPIINTENA = 1启用数据传输;	//启用SPI中断

	//SPIPRI寄存器
	SpiaRegs.SPIPRI.Bit.STEINV = 0;		//SPISTE bar acitve Low
	SpiaRegs.SPIPRI.Bit.TRIWIRE = 0;	//SPIFHS SPIFEC1.BISPFRAST/

	最大SPF1
	位

	SPIFEC1模式SPIFICSPIFEC1;SPIFICRACX.SPIFEC_SPIFEC1位寄存器SPIFICSPIFFAST/最大速度SPIFEC1位SPIFICSPIFICRASPIFEC/最大SPIFECA模式
	//启用FIFO功能

	//SPIFFRX寄存器
	SpiaRegs.SPIFFRX.bit.RXFFIENA = 1; //启用FIFO RX中断
	SpiaRegs.SPIFFRX.bit.RXFFIL = 0x3; //生成中断前收到的3个字


	//SPIBRR寄存
	器SpiaRegs.SPIBRR.All = 0;	//将波特率设置为最大速率

	SpiRegs.SPIFFTX.Bit.SPIRST = 1;
	SpiaRegs.SPIFFTX.Bit.TXISIR.TXI = 1;
	SPIFAIR.SPIRT.SPEAT.SPIRT.SPET.SPIRT
	
	


= 1; SPETCSPET.SPIFAIRT.SPET.SPETCIRT.SPETCREGISETC1 = SPETCSPETCSPEAST.SPET.SPET.SPETCIR.SPETCIR.SPETCIR.SPETCIR.SPIR.SPIR.SPIR.SPIR.SPET.1;SPET.SPETC
静态命令command_state;
易失性int data_rx[3];
易失性int data_tx[3];
无符号int I;

对于(i = 0;i < 3;I++){
DATA_Rx[i]= SpiaRegs.SPIRXBUF;
}

command_state =(命令) data_rx[0];
switch (command_state){
案例(FW_REVISION)://将FW修订版写入TX FIFO
DATA_TX[0]= g_STATUS_WORD_FPGA;
DATA_TX[1]=(g_FW_REVISION | 0xFF00)>> 8;
DATA_TX[2]=(g_FW_REVISION | 0x00FF);
对于(i = 0;i < 3;I++){
SpiaRegs.SPITXBUF=DATA_TX[I];
}
中断;
CASE (converter_index)://读取转换器索引,即master,slave1,slave2等
DATA_TX[0]= g_STATUS_WORD_FPGA;
DATA_TX[1]= 0;
DATA_TX[2]= 0;
g_converter_index =((data_rx[1]<8)+ data_rx[2]);
对于(i = 0;i < 3;I++){
SpiaRegs.SPITXBUF=DATA_TX[I];
}
中断;
CASE (loop_BACK_MODE)://将最近读取的数据放入TX FIFO
DATA_TX[0]= g_STATUS_WORD_FPGA;
DATA_TX[1]= DATA_RX[1];
DATA_TX[2]= DATA_RX[2];
对于(i = 0;i < 3;I++){
SpiaRegs.SPITXBUF=DATA_TX[I];
}
中断;
默认:
DATA_TX[0]= g_STATUS_WORD_FPGA;
DATA_TX[1]= 0xFFFF;
DATA_TX[2]= 0xFFFF;
对于(i = 0;i < 3;I++){
SpiaRegs.SPITXBUF=DATA_TX[I];
}
}

CPU2CLA_comm_fault =假;

SpiaRegs.SPIFFRX.Bit.RXFFOVFCLR=1;//清除溢出标志
SpiaRegs.SPIFFRX.Bit.RXFFINTCLR=1;//清除中断标志
PieCtrlRegs.PIEACK.ALL = M_INT6;

}

此致,

Lance Hummel

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

    Lance

    我在您的配置代码中看不到您在PieCtrlRegs.PIEIER6寄存器中启用中断并在IER中启用CPU中断的位置

    John

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

    我在main.c文件中使用以下代码行处理了这个问题。

    EALLOW;
    PieVectorTable.SPIA_RX_INT =&SPI_commucincation_isr;
    EDIS;

    IER || M_INT6;
    PieCtrlRegs.PIEIER6.bit.INTx1 = 1;//设置SPIA_RX中断(用于一般通信)
    EINT;//启用全局中断INTM
    ERTM;//启用全局实时中断DBGM

    Lance
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否在PIEIFR6中设置了标志?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为,这一评论实际上给了我一个很好的想法,我初始化寄存器的顺序导致了一些错误的结果。 我正在进行一些代码调整以尝试解决问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有一些可以使用的代码,但目前我无法访问它。 如果你不知道,我会再看一次。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    重新排序SPI寄存器的初始化并添加一些额外的代码行以清除任何故障中断后,SPI现在工作正常。 感谢你的帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很高兴听到,玩得开心!