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.

TMS320F280025: LIN寄存器配置异常

Part Number: TMS320F280025
Other Parts Discussed in Thread: C2000WARE

你好,我将28034的LIN相关程序移植到280025之后发现数据接收不了,在28034的板子上是可以正常通讯的(28034和280025的板子都是自己设计的);280025上的相关配置如下:

//管脚与时钟配置
EALLOW;

CpuSysRegs.PCLKCR19.bit.LIN_A = 1;

GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;		   //GPIO28 (LIN TX)
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;		   //GPIO29 (LIN RX)
GpioCtrlRegs.GPAQSEL2.bit.GPIO29 = 3;
GpioCtrlRegs.GPAQSEL2.bit.GPIO29 = 0x01;
GpioCtrlRegs.GPACTRL.bit.QUALPRD3 = 0x03;
GpioCtrlRegs.GPAGMUX2.bit.GPIO28 = 2;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 2;
GpioCtrlRegs.GPAGMUX2.bit.GPIO29 = 2;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 2;
EDIS;

//LIN寄存器配置
EALLOW;
LinaRegs.SCIGCR0.bit.RESET = 0;
LinaRegs.SCIGCR0.bit.RESET = 1;
LinaRegs.SCIGCR1.bit.SWnRST = 0; 

LinaRegs.SCIPIO0.bit.RXFUNC = 1;  //这两句在28034上是没有的,
LinaRegs.SCIPIO0.bit.TXFUNC = 1;  //其他配置都与28034相同

LinaRegs.SCIGCR1.bit.SLEEP = 0;
LinaRegs.SCIFLR.bit.TXWAKE = 0;  
LinaRegs.SCIFLR.bit.TXEMPTY = 1;
LinaRegs.SCIFLR.bit.TXRDY = 1;
//配置为数据接收
LinaRegs.SCIGCR1.bit.RXENA = 1;
LinaRegs.SCIGCR1.bit.TXENA = 0;

LinaRegs.SCIGCR1.bit.TIMINGMODE = 1; //Asynchronous Timing
LinaRegs.SCIGCR1.bit.CLK_MASTER = 1; //Enable SCI Clock
LinaRegs.SCIGCR1.bit.CONT = 1;		 //Continue on Suspend

LinaRegs.SCISETINT.bit.SETRXINT = 1;
LinaRegs.SCISETINT.bit.SETTXINT = 1;
LinaRegs.SCIFORMAT.bit.CHAR = 0x7;
LinaRegs.SCIGCR1.bit.SWnRST = 1; 
       
EDIS;

实验时发送的数据帧:01  03  F0  08  00  01  36  C8

1.在28034的板子上调试时,查看寄存器的配置情况:

接收一帧数据后,接收寄存器的结果如下图所示(接收数据前RXENA和RXIN都是为1的):

2.在280025的板子上调试时,查看寄存器的配置情况:

然而查看Expressions中的寄存配置情况时却是这样的:

可以看到RXENA和RXIN都为0,但是在上一张图中(也就是查看Register)看到的却是有值的,这是什么情况?

当我发送跟28034测试时一样的数据帧,LinaRegs.SCIRD.bit.RD却没有任何变化;发送数据帧时通过测量GPIO29的输入情况如下图所示:

GPIO29确实是有数据输进去的,但是接收寄存器却没有任何值;结合前面的寄存器显示情况,是不是意味着寄存器配置失败?

结合数据手册关于LIN结构的框图

按照我的理解是,只要RXENA配置为1,SCIRD就应该能接收到数据才对。

然而通过Expressions和Registers查看出现不一样的结果,到底以哪个为准?

还请指点,谢谢!

  • 抱歉我对LIN模块不太熟悉,例程也是提供了库形式的模块配置,没有提供寄存器形式的,不知道你有没有参考过官方例程:C:\ti\c2000\C2000Ware_4_00_00_00\driverlib\f28002x\examples\lin

  • 你说的这个例程我也调试过,只能在Registers中查看寄存器配置情况,不知道怎么在Expressions中查看寄存器的配置情况,能不能将我这个问题反馈到其他人解答一下?因为我试了两块板子都这样,其他外设像EPWM,CAP,SPI,SCI,I2C等都是用寄存器形式配置的,也正常。谢谢!

  • 抱歉由于咨询了一下其他工程师,回复慢了些。

    这边希望了解一下:

    1. 使用的是LIN还是SCI?

    2. 波特率如何配置?

    3. 是否通过 LIN 收发器传输数据,如果是,配置的波特率是多少?

    另外,方便的话可以将工程打包压缩之后上传一下吗?

  • 非常感谢您的用心回答,其实主要的问题是寄存器设置不进去,例如我单步调试到LinaRegs.SCIGCR0.bit.RESET = 1,执行完这句后,通过观察窗口查看LinaRegs.SCIGCR0.bit.RESET的结果仍然为0;28002xProject_TI.rar

  • 你好,我们这边工程师测试了一下工程,发现在他那边是可以更新LINA regs的。

    有没有尝试单步执行代码,或者是否设置了一个断点并运行到模块配置结束?

    另外,我看到配置是针对 SCI 而不是 LIN,没有配置 LINMODE?

  • 是的,其实配置的是SCI功能,但是我的问题其实一直都是寄存器写不进去;调试的时候当然有单步调试过,例如我单步调试执行完以下语句时:

    LinaRegs.SCIGCR1.bit.RXENA = 1;

    通过查看窗口查看的结果如下:

    当我连续运行,然后再停止时,看到的结果仍然是上图所示的结果,也就是说寄存器的值写不进去;

    看了你回答中的截图,疑问如图所示:

  • 我这边的工程师回复:

    由于某种原因,位域似乎没有显示更新的值。 但是,如果查看memory map和register窗口,它们会正确更新。

    建议在调试时使用Register窗口查看配置更新。

    另外,我不知道连续运行之后暂停,跟连续运行并打断点是否会有区别,但是那位工程师提到,如果在配置结束后的代码打断点,然后连续运行并停在断点后,配置的寄存器有没有更新?

  • 位域显示的问题好像只有LIN相关的寄存器才会这样,其他的不会,例如工程中对于IO口的配置,位域显示是正常的;你那边用我的工程能接受到数据吗?就是说接受中断能进去吗?

  • 希望你那边的工程师能用我的这个工程烧写到TI的开发板上,然后发送数据到GPIO29管脚上,看看能否进入接收中断进行数据接收,谢谢!

  • 这个问题之前问过其他工程师,但是隔的时间有点久,漏贴了。他的回复是这样的:

    LIN is on the VBUSP bridge and has byte accessibility, so that could be the reason why the bit display is not working correctly, as other peripherals has x16 addressing. In any case you should be able to check the memory map or the register view to confirm the configuration. 

    Running the code, I see that the SCIGCR1 bits are set correctly:

    When running the code, the RX-ISR is not being entered (tested with a break-point). Therefore there is something incorrectly set up with the configuration or the interrupt code

    For debugging, please utilize the "lin_ex2_sci_loopback.c" example from C2000Ware to start with. See if any errors occur with this C2000Ware example on the customer setup.

    If no errors with this example, modify the example to change from loopback to external connections.

    Finally, if external connections work with the example, try porting to the customer's desired final code.

    By going in small incremental changes from known-good code like this, it should help resolve the issue/find the source of the problem quickly.

  • 感谢回复,因为我这个工程是从28034上移植过来的,在28034上接收和发送都是正常的,所以才有以上的疑问。我先用例程测试,如果还有疑问再来请教,再次感谢!

  • 好的。

    另外,如果隔了很长时间没更新的帖子最好点击右上角的“提出相关问题”来发布一个新帖,这样时效性更好一些,我们不至于漏贴。