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 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;