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.

[参考译文] TMS320F2800157:LIN 模型从节点问题

Guru**** 2540720 points
Other Parts Discussed in Thread: TMS320F2800157

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1307870/tms320f2800157-lin-model-slave-node-question

器件型号:TMS320F2800157

我有一个关于 LIN 模块的问题:

1:环境:

  1) PC LIN 主节点

  2) TMS320F2800157   LIN 从节点

  3 ) PIN5  LIN 使能

     引脚2  LIN-TX

     引脚1  LIN-RX

2:代码  

1)Macor
#define GPIO_PIN_LINA_RX 29
#define myLIN0_LINRX_GPIO 29

#define myLIN0_LINRX_PIN_CONFIG GPIO_29_LINA_RX

//
// LINA_TX - GPIO Settings
//

#define GPIO_PIN_LINA_TX 28
#define myLIN0_LINTX_GPIO 28
#define myLIN0_LINTX_PIN_CONFIG GPIO_28_LINA_TX
#define myGPIO0 242
#define myGPIO0_GPIO_PIN_CONFIG GPIO_242_GPIO242

2 ) Init -SYSCLK  120M
// GPIO242 -> myGPIO0 Pinmux

GPIO_setPinConfig(GPIO_242_GPIO242);

// AGPIO -> GPIO mode selected

GPIO_setAnalogMode(242, GPIO_ANALOG_DISABLED);

//

// LINA -> myLIN0 Pinmux

//

GPIO_setPinConfig(myLIN0_LINRX_PIN_CONFIG);
GPIO_setPadConfig(myLIN0_LINRX_GPIO, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(myLIN0_LINRX_GPIO, GPIO_QUAL_ASYNC);
GPIO_setPinConfig(myLIN0_LINTX_PIN_CONFIG);
// AGPIO -> GPIO mode selected
GPIO_setAnalogMode(28, GPIO_ANALOG_DISABLED);
GPIO_setPadConfig(myLIN0_LINTX_GPIO, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(myLIN0_LINTX_GPIO, GPIO_QUAL_ASYNC);
LIN_initModule(myLIN0_BASE);
//
// Enter Software Reset State
//
LIN_enterSoftwareReset(myLIN0_BASE);
LIN_setLINMode(myLIN0_BASE, LIN_MODE_LIN_RESPONDER);
LIN_setCommMode(myLIN0_BASE, LIN_COMM_LIN_USELENGTHVAL);
LIN_setDebugSuspendMode(myLIN0_BASE, LIN_DEBUG_COMPLETE);
LIN_setChecksumType(myLIN0_BASE, LIN_CHECKSUM_ENHANCED);
LIN_setMessageFiltering(myLIN0_BASE, LIN_MSG_FILTER_IDRESPONDER);
LIN_enableParity(myLIN0_BASE);
//
// Finally exit SW reset and enter LIN ready state
//
LIN_exitSoftwareReset(myLIN0_BASE);
//
// Enable LIN Interrupts
//
LIN_enableInterrupt(myLIN0_BASE, LIN_INT_ID| LIN_INT_RX);
//
// Set the interrupt priority line
//
LIN_setInterruptLevel0(myLIN0_BASE, LIN_INT_ID| LIN_INT_RX);
LIN_enableGlobalInterrupt(myLIN0_BASE, LIN_INTERRUPT_LINE0);
LIN_clearGlobalInterruptStatus(myLIN0_BASE, LIN_INTERRUPT_LINE0);
GPIO_writePin(myGPIO0, 1);
Interrupt_register(INT_LINA_0, &level0ISR);
Interrupt_enable(INT_LINA_0);
LIN_setBaudRatePrescaler(LINA_BASE, 389U, 10U);

3 ) Interrupt Function

uint32_t i, dataIndex;
uint16_t txID,rxID,rxID2, error;
#define FRAME_LENGTH 0x8
#define LIN_PASS  0xABCD
#define LIN_FAIL  0xFFFF
volatile uint32_t level0Count = 0;
volatile uint32_t level1Count = 0;
volatile uint32_t vectorOffset = 0;
uint16_t result;
uint16_t txData[8] = {0x11, 0x34, 0x56, 0x78, 0x9A, 0xAB, 0xCD, 0xEF};
uint16_t txData2[8] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
uint16_t rxData[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
__interrupt void
level0ISR(void)
{
//
// Increment the interrupt count
//
level0Count++;
rxID = LIN_getRxIdentifier(LINA_BASE)& 0x3F;
if(rxID== 0x2)
{
    LIN_setFrameLength(LINA_BASE, 8);
    if(LIN_isRxReady(LINA_BASE) == 1)
    {
    LIN_getData(LINA_BASE, rxData);
    }
}
else if(rxID == 0x3)
{
    if(LIN_isTxReady(LINA_BASE) ==1)
   {
   LIN_setFrameLength(LINA_BASE, 8);
   LIN_sendData(LINA_BASE, txData);
   }
}
else if(rxID == 0x4)
{
    if(LIN_isTxReady(LINA_BASE) ==1)
    {
    LIN_setFrameLength(LINA_BASE, 8);
    LIN_sendData(LINA_BASE, txData2);
    }
}
else if(rxID == 0x15)
{
    i++;
}
 //
  // Read the high priority interrupt vector
 //
 vectorOffset = LIN_getInterruptLine0Offset(LINA_BASE);
 //LIN_clearInterruptStatus(LINA_BASE, LIN_INT_ID | LIN_INT_OE |LIN_INT_FE );
 LIN_clearInterruptStatus(LINA_BASE,LIN_INT_ALL);
 LIN_clearGlobalInterruptStatus(LINA_BASE, LIN_INTERRUPT_LINE0);
 //
 // Acknowledge this interrupt located in group 6
 //
 Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP6);
 }

3:当前代码运行的结果

我的 LIN 计划表

我的例外结果

IC 接收 02 -03 02 03 04 05 06 07 08 -20ms

IC 传输03-11 34 56 78 9A AB CD EF -10ms

IC 传输04 - AA AA AA AA AA AA AA AA AA AA AA AA AA-90ms

我的实际结果

Q1 : 基于头0x03和0x04回复消息,实际结果是头0x04后跟消息错误,头0x16跟0x04要发送消息,解决它的方法是什么?

Q2:如何修改代码配置以实现通过单个中断发送和接收 LIN 数据的功能?

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

    大家好、

    感谢您的提问。

    Unknown 说:
    Q1: 基于标头0x03和0x04回复消息,实际结果是标头0x04后跟消息错误,标头0x16后跟0x04要发送消息,解决方法是什么?

    else if(rxID == 0x3)
    {
        if(LIN_isTxReady(LINA_BASE) ==1)
       {
       LIN_setFrameLength(LINA_BASE, 8);
       LIN_sendData(LINA_BASE, txData);
       }
    }
    else if(rxID == 0x4)
    {
        if(LIN_isTxReady(LINA_BASE) ==1)
        {
        LIN_setFrameLength(LINA_BASE, 8);
        LIN_sendData(LINA_BASE, txData2);
        }
    }

    您可能需要等待 TX 缓冲区准备就绪、请参阅以下线程中我最后接受的答案的此代码片段:

            // Send TX Data
            LIN_sendData(LINA_BASE, txData);
            //
            // Wait until Transmit buffer is empty and has completed transmission
            //
            while(!LIN_isTxBufferEmpty(LINA_BASE));

    发件人: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1114621/tms320f280049c-lin-module-in-slave-mode---how-to-initiate-response-transmission/4153936#4153936

    Unknown 说:
    Q2:如何修改代码配置来实现通过单个中断发送和接收 LIN 数据的功能?

    因此、我建议查看上面提到的线程、MainLoop 代码可以改为放置在 ISR 中、它会在 RxMatch 和 TxMatch 函数之间检查以查看要执行的操作。

    此致、

    文斯

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

    Q1: while (!LIN_isTxBufferEmpty (Lina_base));  在中断函数内部运行

    循环等待会影响 CPU 加载因子。

    有其他解决方案吗?

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

    大家好、

    您还可以使用 TX 中断并对"lin_isTxBufferEmpty"进行单次检查

    此致、

    文斯