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.
您好!
我正在尝试在从模式下配置和使用 LIN 端口。 但我没有收到任何中断、即使在我使用示波器检查时总线上有流量也是如此。
我正在使用 LIN1。 在 HALCogen 中、我无法在 LIN 全局选项卡中启用中断和 TX 中断。 此外、当我取消选中主控模式复选框并生成代码时、 GCR1中的相关位不会更改、因此我改为更改了 HL_LIN.c。 以下是我的 HL_LIN.c、经过修改:
void linInit (void) { /*用户代码开始(2)*/ /*用户代码结束*/ /**@b 初始化@b LIN */ /**-从重置中释放*/ linREG1->GCR0 = 1U; /**-启动 LIN 配置 * -使状态机保持软件复位 */ linREG1->GCR1 = 0U; /**-启用 LIN 模式*/ linREG1->GCR1 = 0x40U; /**-设置控制寄存器1 * -启用发送器 * -启用接收器 * -进入调试模式时停止 * -禁用环回模式 * -禁用/启用 HGENCTRL (使用 ID 字节进行屏蔽滤波) * -使用增强校验和 * -启用多缓冲模式 * -禁用自动波特率调整 * -禁用睡眠模式 * -将 LIN 模块设置为主模块 * -启用/禁用奇偶校验 * -禁用 ID4和 ID5中的数据长度控制 * linREG1->GCR1 |= 0x03000C40U |(uint32)((uint32) 1U <<12U) |(uint32)((uint32) 0U << 2U); /**-设置最大波特率预分频器*/ linREG1->MBRSR =(uint32) 5155U; /**-设置波特率预分频器*/ linREG1->BRS=(uint32) 357U; /**-设置 RX 和 TX 接收屏蔽*/ linREG1->MASK =((uint32)((uint32) 0xU <<16U)|(uint32) 0x10U); /**-设置比较 * -同步定界符 * -同步中断扩展 * 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) 0U |(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) 0x80000000U |(UINT32) 0x40000000U |(UINT32) 0x20000000U |(UINT32) 0x10000000U |(UINT32) 0x08000000U |(UINT32) 0x04000000U |(UINT32) 0x02000000U |(UINT32) 0x01000000U |(UINT32) 0x00002000U |(UINT32) 0x00000200U |(UINT32) 0x00000100U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000002U |(UINT32) 0x00000001U); /**-最终启动 LIN */ linREG1->GCR1 |= 0x00000080U; /**@b 初始化@b LIN */ /**-从重置中释放*/ linREG2->GCR0 = 1U; /**-启动 LIN 配置 * -使状态机保持软件复位 */ linREG2->GCR1 = 0U; /**-启用 LIN 模式*/ linREG2->GCR1 = 0x40U; /**-设置控制寄存器1 * -启用发送器 * -启用接收器 * -进入调试模式时停止 * -禁用环回模式 * -禁用/启用 HGENCTRL (使用 ID 字节进行屏蔽滤波) * -使用增强校验和 * -启用多缓冲模式 * -禁用自动波特率调整 * -禁用睡眠模式 * -将 LIN 模块设置为主模块 * -启用/禁用奇偶校验 * -禁用 ID4和 ID5中的数据长度控制 * linREG2->GCR1 |= 0x03000C60U |(uint32)((uint32) 1U <<12U) |(uint32)((uint32) 0U << 2U); /**-设置最大波特率预分频器*/ linREG2->MBRSR =(uint32) 5155U; /**-设置波特率预分频器*/ linREG2->BRS=(uint32) 357U; /**-设置 RX 和 TX 接收屏蔽*/ linREG2->MASK =((uint32)((uint32) 0xFFU <<16U)|(uint32) 0xFFU); /**-设置比较 * -同步定界符 * -同步中断扩展 * linREG2->COMP =((uint32)((uint32)(1U - 1U)<<8U)|((uint32) 13U - 13U)); /**-设置响应长度*/ linREG2->format =((linREG2->format & 0xFFF8FFFFU)|(uint32)(((uint32) 8U - 1U)<< 16U); /**-设置 LIN 引脚功能模式 * - TX * - RX * - CLK * linREG2->PIO0 =((uint32) 4U |(uint32) 2U |(uint32) 0U); /**-设置 LIN 引脚默认输出值 * - TX * - RX * - CLK * linREG2->PIO3=((uint32) 0U |(uint32) 0U |(uint32) 0U); /**-设置 LIN 引脚输出方向 * - TX * - RX * - CLK * linREG2->PIO1 =((uint32) 0U |(uint32) 0U |(uint32) 0U); /**-设置 LIN 引脚开漏使能 * - TX * - RX * - CLK * linREG2->PIO6 =((uint32) 0U |(uint32) 0U |(uint32) 0U); /**-设置 LIN 引脚上拉/下拉使能 * - TX * - RX * - CLK * linREG2->PIO7=((uint32) 0U |(uint32) 0U |(uint32) 0U); /**-设置 LIN 引脚上拉/下拉选择 * - TX * - RX * - CLK * linREG2->PIO8=((uint32) 4U |(uint32) 2U |(uint32) 1U); /**-设置中断级别 * -位错误级别 * -物理总线错误级别 * -校验和错误级别 * -同步字段错误级别不一致 * -无响应错误级别 * -帧错误级别 * -溢出错误级别 * -奇偶校验错误级别 * -标识符级别 * - RX 电平 * - TX 电平 * - 3个唤醒信号电平后超时 * -唤醒信号电平后超时 * -超时级别 * -唤醒电平 * 中断检测级别 * linREG2->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个唤醒信号电平后的超时 * -唤醒信号电平后启用/禁用超时 * -启用/禁用超时级别 * -启用/禁用唤醒电平 * -启用/禁用中断检测级别 * linREG2->SETINT =((UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000200U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U); /**-最终启动 LIN */ linREG2->GCR1 |= 0x00000080U; /*用户代码开始(3)*/* 用户代码结束*/ }
谢谢、
SA
谢谢。 有什么想法、为什么我不会获得中断中断? 当我在 LIN->MASK 中将0xFF 用作 TX 和 RX 的屏蔽时、我确实会获得 ID 中断。
谢谢、
SA