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.

[参考译文] TMS570LC4357:TMS570LC4357 LIN 奇偶校验位生成错误

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/745193/tms570lc4357-tms570lc4357-lin-parity-bit-generation-wrong

器件型号:TMS570LC4357

尊敬的团队:

我正在我的项目中使用 TMS570LC4357 MCU。LIN 控制器不会生成奇偶校验位。

我将 LIN1配置为主器件、并将其连接到矢量 LIN 硬件(从器件)

A)如果我使用 ID 0x17生成标头,则向量设备抛出 ID/奇偶校验错误

根据计算, 奇偶校验位 P0 =0,P1 =1,但硬件生成的两个位都为0,P0,P1 =0;(在示波器中观察到)

B)如果我使用其他 ID,例如37,则向量 设备获得正确的标头并以数据进行响应

 根据计算结果,奇偶校验位 P0 =0,P1 =0,硬件生成两个位为0,P0,P1 =0;

观察结果:

LIN 控制器未正确执行奇偶校验计算。

LIN MCU 配置供您参考

 /**-从重置中释放*/
   linREG1->GCR0 = 1U;

   /**-启动 LIN 配置
   *    -保持状态机处于软件复位状态
   *
   linREG1->GCR1 = 0U;

   /**  -启用 LIN 模式*/
   linREG1->GCR1 = 0x40U;
   
   /**-设置控制寄存器1
   *    -启用发送器
   *    -启用接收器
   *    -进入调试模式时停止
   *    -禁用环回模式
   *    -禁用/启用 HGENCTRL (使用 ID 字节进行屏蔽滤波)
   *    -使用增强校验和
   *    -启用多缓冲模式
   *    -禁用自动波特率调整
   *    -禁用睡眠模式
   *    -将 LIN 模块设置为主模块
   *    -启用/禁用奇偶校验
   *    -在 ID4和 ID5中禁用数据长度控制
   *
   linREG1->GCR1 |= 0x03000C60U
                |(uint32)((uint32) 1U <<12U)
            /*|(uint32)((uint32) 0U <<17U)//新增了*/
                |(uint32)((uint32) 1U << 2U);
               
   /**-设置最大波特率预分频器*/
   linREG1->MBRSR =(uint32) 4507U;

   /**-设置波特率预分频器*/
   linREG1->BRS =(uint32) 324U;

   /**-设置 RX 和 TX 接收屏蔽*/
   linREG1->MASK =((uint32)((uint32) 0xFFU <<16U)|(uint32) 0xFFU);

   /**-设置比较
   *    -同步定界符
   *    -同步间隔扩展
   *
   linREG1->COMP =((uint32)((uint32)(1U - 1U)<<8U)|((uint32) 13U - 13U));

   /**-设置响应长度*/
   linREG1->format =((linREG1->format & 0xFFF8FFFFU)|(uint32)(((uint32) 8U - 1U)<< 16U);

   /**-设置 LIN 引脚功能模式
   *    - TX
   *    - RX
   *    - CLK
   *
   linREG1->PIO0 =((uint32) 4U |(uint32) 2U |(uint32) 0U);

   /**-设置 LIN 引脚默认输出值
   *    - TX
   *    - RX
   *    - CLK
   *
   linREG1->PIO3=((uint32) 0U |(uint32) 0U |(uint32) 0U);

   /**-设置 LIN 引脚输出方向
   *    - TX
   *    - RX
   *    - CLK
   *
   linREG1->PIO1 =((uint32) 4U |(uint32) 0U |(uint32) 0U);

   /**-设置 LIN 引脚开漏使能
   *    - TX
   *    - RX
   *    - CLK
   *
   linREG1->PIO6 =((uint32) 0U |(uint32) 0U |(uint32) 0U);

   /**-设置 LIN 引脚上拉/下拉使能
   *    - TX
   *    - RX
   *    - CLK
   *
   linREG1->PIO7=((uint32) 0U |(uint32) 0U |(uint32) 0U);


   /**-设置 LIN 引脚上拉/下拉选择
   *    - TX
   *    - RX
   *    - CLK
   *
   linREG1->PIO8=((uint32) 4U |(uint32) 2U |(uint32) 1U);

   /**-设置中断级别
   *    -位错误级别
   *    -物理总线错误级别
   *    -校验和错误级别
   *    -不一致的同步字段错误级别
   *    -无响应错误级别
   *    -帧错误级别
   *    -溢出错误级别
   *    -奇偶校验错误级别
   *    -标识符级别
   *    - RX 电平
   *    - TX 级别
   *    - 3个唤醒信号电平后超时
   *    -唤醒信号电平后超时
   *    -超时级别
   *    -唤醒电平
   *    -中断检测级别
   *
   linREG1->SETINTLVL =((UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U
                      |(UINT32) 0x00000000U);

   /**-设置中断使能
   *    -启用/禁用位错误
   *    -启用/禁用物理总线错误级别
   *    -启用/禁用校验和错误级别
   *    -启用/禁用不一致的同步字段错误级别
   *    -启用/禁用无响应错误级别
   *    -启用/禁用组帧错误级别
   *    -启用/禁用溢出错误级别
   *    -启用/禁用奇偶校验错误级别
   *    -启用/禁用标识符级别
   *    -启用/禁用 RX 电平
   *    -启用/禁用 TX 级别
   *    -启用/禁用3个唤醒信号电平后的超时
   *    -启用/禁用唤醒信号电平后的超时
   *    -启用/禁用超时级别
   *    -启用/禁用唤醒电平
   *    -启用/禁用中断检测级别
   *
   linREG1->SETINT =((UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U
                   |(UINT32) 0x00000000U);

   /**-最终启动 LIN */
   linREG1->GCR1 |= 0x00000080U;

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

    我将执行一项测试、然后返回给您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mani 您好!

    器件硬件不会生成奇偶校验位。 在 GCR2中的奇偶校验_ENA 位被置位后、ID 字段的 bit6/bit7被用作 ID 的奇偶校验。 否则、这2个位用于 ID。 奇偶校验必须由 SW 使用以下公式计算:

    在本例中、最好直接将8b10010111 (2个奇偶校验位+ 0x17 ID)写入 ID 字段。 给我带来的不便、我深表歉意。