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 从设备驱动程序、 当我们从独木舟传输数据时、无法在 F280015x 控制卡上获取 RX 中断。
请查看下面的图片( F280015x_ Control_Card_Switch_Configuration )包含控制卡及开关位置,
请查找有关硬件连接的详细信息:
我们使用 LIN 收发器(TLIN2029EVM)在具有 C2000 F280015x 控制卡的 TMDSHSECDOCK 控制卡集线站[修订版 F]与 LIN 主站(我们将 Canoe 接口用于 LIN 主站)之间建立通信。
我们已将 LIN 收发器 RX 引脚连接至 TMDSHSECDOCK 控制卡集线站[Rev F] RX 引脚、即集线站上的引脚编号90 (GPIO35)和 Tx 引脚编号85 (GPIO32)以及 LIN 收发器 EN 引脚编号88 (GPIO37)。
请查看以下 LIN 初始化 API 伪代码说明、以便在从模式下配置 LIN。
void LINDrv_Init(void) { /* Initialize LIN state to IDLE. */ g_LIN_State = LIN_STATE_IDLE; /* Enable LIN peripheral Module Clock */ SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_LINA); EALLOW; /* Set the Interrupt Handler */ Interrupt_register(INT_LINA_0, &LINDrv_IntLevel0Handle); /* LIN Tx GPIO Configuration */ GPIO_setPinConfig(GPIO_32_LINA_TX); /* Set the direction */ GPIO_setDirectionMode(LIN_TX_GPIO_PIN,GPIO_DIR_MODE_OUT); /* Configure the Pin as PushPull */ GPIO_setPadConfig(LIN_TX_GPIO_PIN,GPIO_PIN_TYPE_STD); /* LIN Rx GPIO Configuration */ GPIO_setPinConfig(GPIO_35_LINA_RX); /* Set the direction */ GPIO_setDirectionMode(LIN_RX_GPIO_PIN,GPIO_DIR_MODE_IN); /* Configure the Pin as PushPull */ GPIO_setPadConfig(LIN_RX_GPIO_PIN,GPIO_PIN_TYPE_STD); /* Reset the Module */ LIN_REG_SCIGCR0 |= LIN_SCIGCR0_RESET; /* Reset the Software Reset Bit */ LIN_REG_SCIGCR1 &= ~(LIN_SCIGCR1_SWNRST); /* Configure the LINRx and LINTx Pin */ LIN_REG_SCIPIO0 |= (LIN_SCIPIO0_RXFUNC | LIN_SCIPIO0_TXFUNC); /* Select LIN Mode */ LIN_REG_SCIGCR1 |= LIN_SCIGCR1_LINMODE; /* Configure the LIN Module in Slave mode */ LIN_REG_SCIGCR1 |= (LIN_REG_SCIGCR1 & ~(LIN_SCIGCR1_CLK_MASTER)); /* Disable the ID4/ID5 bits for length control*/ LIN_REG_SCIGCR1 |= (LIN_REG_SCIGCR1 & ~(LIN_SCIGCR1_TIMINGMODE | LIN_SCIGCR1_COMMMODE)); /* Debug mode */ LIN_REG_SCIGCR1 |= (LIN_REG_SCIGCR1 & (~(LIN_SCIGCR1_CONT))); /* Configure the Parity */ LIN_REG_SCIGCR1 |= LIN_SCIGCR1_PARITYENA; /* Configure the max Response Length */ LIN_REG_SCIFORMAT |= ((((uint32_t)MAXLENGTH - (uint32_t)LIN_CONST_NO_ONE) << \ LIN_SCIFORMAT_LENGTH_S)); /* Checksum Type Selection */ #if(LIN_CHECKSUM_TYPE == LIN_ENHANCEMENT_CHECKSUM_TYPE) { /* Configure the Enhancement type checksum */ LIN_REG_SCIGCR1 |= LIN_SCIGCR1_CTYPE; } #else { /* Configure the Classic type checksum */ LIN_REG_SCIGCR1 |= (LIN_REG_SCIGCR1 & (~(LIN_SCIGCR1_CTYPE))); } #endif /* Trigger Checksum Compare */ LIN_REG_SCIGCR2 |= LIN_SCIGCR2_CC; /* Send CheckSum */ LIN_REG_SCIGCR2 |= LIN_SCIGCR2_SC; /* Disable Auto BaudRate */ LIN_REG_SCIGCR1 |= (LIN_REG_SCIGCR1 & (~LIN_SCIGCR1_ADAPT)); /* Select Multi-buffer */ LIN_REG_SCIGCR1 |= LIN_SCIGCR1_MBUFMODE; /* Disable LOOP-BACK Mode */ LIN_REG_SCIGCR1 |= (LIN_REG_SCIGCR1 &~(LIN_SCIGCR1_LOOPBACK)); /* Disable External Loop back mode */ LIN_REG_IODFTCTRL &= ~(LIN_IODFTCTRL_IODFTENA_M |LIN_IODFTCTRL_LPBENA | LIN_IODFTCTRL_RXPENA); /* Synch break and synch delimiter additional bits */ LIN_REG_COMP |= (LIN_SYNCH_BREAK_LEN | ((LIN_SYNCH_DELIMITER_LEN - 1U) << LIN_COMP_SDEL_S)); /* Configure the BaudRate */ LINDrv_SetBuadRate(); /* Configure message filtering */ #if(LIN_HGENCTRL_TYPE == LIN_CONST_NO_ONE) { /* Configure the Slave ID for message filtering */ LIN_REG_SCIGCR1 |= LIN_SCIGCR1_HGENCTRL; /* Configure the Filter Compare Slave task ID byte*/ LIN_REG_ID |= (uint32_t)LIN_SLAVETASKIDBYTE << LIN_CONST_NO_EIGHT; /* Configure the Rx Filter Mask */ LIN_REG_MASK |= ((uint32_t)LIN_RXMESSAGEID_FILTERMASK << LIN_CONST_NO_SIXTEEN); /* Configure the Tx Filter Mask */ LIN_REG_MASK |= (uint32_t)LIN_TXMESSAGEID_FILTERMASK; } #else { /* Configure the ID for message filtering */ LIN_REG_SCIGCR1 |= (LIN_REG_SCIGCR1 & (~(LIN_SCIGCR1_HGENCTRL))); /* Configure the Filter Compare ID byte*/ LIN_REG_ID |= (uint32_t)LIN_SLAVETASKIDBYTE; /* Configure the Rx Filter Mask */ LIN_REG_MASK |= ((uint32_t)LIN_RXMSGID_FILTERMSK_ZERO << LIN_CONST_NO_SIXTEEN); /* Configure the Tx Filter Mask */ LIN_REG_MASK |= (uint32_t)LIN_TXMSGID_FILTERMSK_ZERO; } #endif /* Enable the Transmit */ LIN_REG_SCIGCR1 |= LIN_SCIGCR1_TXENA; /* Enable the Receive */ LIN_REG_SCIGCR1 |= LIN_SCIGCR1_RXENA; /* Reset the Software Reset Bit */ LIN_REG_SCIGCR1 |= (LIN_SCIGCR1_SWNRST); EDIS; /* Enable Interrupt - Bit Error Interrupt, Physical Bus Error interrupt, * Checksum Error Interrupt, Sync Frame Error Interrupt, * No Response Error Interrupt, Frame Error Interrupt, * Over run Interrupt, Parity Error Interrupt, ID Interrupt ,Timeout after Wake-up Signal Interrupt, Timeout after Three Wake-up Signal Interrupt */ LIN_REG_SCISETINT = ( LIN_SCISETINT_SETBEINT | LIN_SCISETINT_SETPBEINT | \ LIN_SCISETINT_SETCEINT | LIN_SCISETINT_SETISFEINT | \ LIN_SCISETINT_SETNREINT | LIN_SCISETINT_SETFEINT | \ LIN_SCISETINT_SETOEINT | LIN_SCISETINT_SETPEINT | \ LIN_SCISETINT_SETIDINT | LIN_SCISETINT_SETTIMEOUTINT | LIN_SCISETINT_SETTOA3WUSINT | LIN_SCISETINT_SETTOAWUSINT); /* Set Interrupt Level 0 */ LIN_REG_SCICLEARINTLVL = ( LIN_SCISETINT_SETBEINT | LIN_SCISETINT_SETPBEINT | \ LIN_SCISETINT_SETCEINT | LIN_SCISETINT_SETISFEINT | \ LIN_SCISETINT_SETNREINT | LIN_SCISETINT_SETFEINT | \ LIN_SCISETINT_SETOEINT | LIN_SCISETINT_SETPEINT | \ LIN_SCISETINT_SETIDINT | LIN_SCISETINT_SETTIMEOUTINT | LIN_SCISETINT_SETTOA3WUSINT | LIN_SCISETINT_SETTOAWUSINT); /* Enable Global Interrupt */ LIN_REG_GLB_INT_EN |= LIN_GLB_INT_EN_GLBINT0_EN << LIN_LINE0_INTERRUPT; /* Clear the Global Interrupt Status */ LIN_REG_GLB_INT_FLG |= LIN_GLB_INT_CLR_INT0_FLG_CLR << LIN_LINE0_INTERRUPT; /* Enable Interrupts */ Interrupt_enable(INT_LINA_0); /* No Error */ g_LIN_ErrVal = LIN_NOERR; }
如果需要更改扩展坞或控制卡上的任何配置引脚、请告知我们。
提前感谢。
此致、
迪内什·雷迪
尊敬的 Dinesh:
以下是一些检查/尝试的内容:
1.以此确保、您是否调用 EINT;以便在代码中的其他位置全局启用中断? 要使任何中断正常工作、就需要包含此函数。
2.在没有从模式并且没有连接到任何其他设备的情况下尝试。 看看 TX 引脚是否可以作为主器件传输消息报头。 如果在确定 TX 引脚范围时看到标头字段、则至少已正确配置所选的 LIN 模块并且硬件输出良好。
3、接下来通过在 C2000器件接收数据时获取其 RX 引脚的示波器捕获、查看器件的 RX 引脚是否正在从主器件接收有效数据。 请确保我们可以使用捕获通过数据确定位的宽度、从而确保波特率正确。
此致、
德拉尼
尊敬的 Delaney:
感谢您的回复、请查看我们根据您的建议尝试过的以下要点、
1. 是的, 我们的工作区已启用 EINT。 请查看以下图片,以供参考。
2.我们尝试了 LIN 作为主模式,并 将数据发送到 Tx 引脚,但 TX 引脚上仍然没有数据(已通过逻辑分析仪验证)。
3.我们用示波器检查并观察到1V,请找到下图供您参考。
注意:我们尝试了使用 LIN 示例、但 Tx 和 Rx 引脚中仍然没有数据
您能否说明 code composer "SYSCFG"和 TMDSHSECDOCK (F2800157SPN_Schematic)的 LIN Tx 和 Rx 引脚的确切配置?
尊敬的 Dinesh:
以下控制卡集线站引脚应用于收发器与集线站的物理连接。
LINA_RX = GPIO35 = TMDSHSECDOCK 引脚90
LINA_TX = GPIO37 = TMDSHSECDOCK 引脚88
SysConfig 选择应如下所示:
要在 CSS SysConfig 中查看集线站(标记为(标题))的接头引脚、请点击右上角的三个点[更多视图]>>首选项和操作>>开关>>板、然后从下拉列表中选择正在使用的板。
此致、
德拉尼
尊敬的 Delaney:
我们已 根据您的建议尝试了 SysConfig 中的外设和引脚配置、但在配置时收到以下错误。
这是我们选择开关板设置的方式、请找到以下快照供您参考、让我知道它是否纠正。
谢谢。
Dinesh Reddy。
尊敬的 Dinesh:
您可以尝试以下操作吗:
1.以文本形式打开.syscfg 文件(右键点击.syscfg 文件>> Open with >> Generic Text Editor)
2.删除所有$ASSIGN 行,如下所示。
3.保存并关闭 SysConfig 文本文件、然后关闭 SysConfig GUI。
4.重新打开 SysConfig GUI 并再次尝试选择引脚。
如果这样不能解决问题、请共享您的 SysConfig 文本文件、我可以来看一下。
此致、
德拉尼
尊敬的 Delaney:
我们尝试根据您的建议仍然得到相同的错误。
注意:我无法在此主题中上传 SYSCFG 文件。 请告知我们发送文件的替代方法。
谢谢。
迪内什·雷迪
尊敬的 Dinesh:
您正在使用什么版本的 SysConfig 安装?
此致、
德拉尼
尊敬的 Delaney:
我们已安装版本1.19.0.3426、请找到以下快照以供参考。
谢谢。
Dinesh Reddy。
尊敬的 Dinesh:
我能够使用 CCS 中相同的 SysConfig 版本和配置复制此问题。 在选择板时、SysConfig 生成的代码似乎存在问题。 我会咨询其他专家、了解为什么会发生这种情况、并看看是否需要在最后修复。
不过、当未选择板时、会生成不同的代码(如下所示)、并且不会导致相同的构建错误。 您能否尝试使用 GPIO35和 GPIO37配置 SysConfig 不带 选择 F280015控制卡、看看是否收到相同的构建错误? 集线站引脚90和88无论如何都可以正常工作、只是它们不会显示在 GUI 中。
此致、
德拉尼
尊敬的 Dinesh:
在与其他专家交谈后,我相信我找到了原因。 将板添加到 SysConfig 时、需要取消选中"Lock Resource Allocation"以避免这些构建错误。
请告诉我、这是否可以为您解决该问题、或者您还有其他问题。
此致、
德拉尼
e2e.ti.com/.../SysCfgFile.txte2e.ti.com/.../workspace_5F00_v12-_2D00_-lin_5F00_ex1_5F00_loopback_5F00_interrupts_5F00_c2000.syscfg-_2D00_-Code-Composer-Studio-2024_2D00_03_2D00_11-11_2D00_30_2D00_51.mp4
尊敬的 Delaney:
禁用"Lock Resource Allocation"未解决错误。 我已经附上了 SYSCFG 文件和一个屏幕记录、显示试图在"lin_ex1_loopback_interrupts"工作区中取消选中以供参考。
谢谢。
Dinesh Reddy。
尊敬的 Dinesh:
很抱歉没有解决这个问题。 你能否尝试执行本 线程中的步骤 、从项目属性中删除当前器件、然后尝试添加板? 如果 仍在工程属性中设置了旧器件、则可能会覆盖 SysConfig 中的电路板设置。 这可能是您看到生成错误的原因。
此致、
德拉尼