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.
王工:
您好,通过HALCoGen将DCAN2、DCAN3对应的TX、RX配置成GPIO模式,且均为输入
故障现象CAN2的TX引脚导通时电平为0V,CAN3的TX引脚导通时电平2.5V,通过HALCoGen生成驱动文件“HL_can.c”,在文件中canInit函数中,对CAN2、CAN3的配置不一致,请问一下什么会出现这个情况(将CAN3的配置手动改成和CAN2的一样,CAN3 TX电平测量正常)
void canInit(void)
{
/* USER CODE BEGIN (4) */
/* USER CODE END */
/** @b Initialize @b CAN2: */
/** - Setup control register
* - Enter initialization mode
*/
canREG2->CTL = 0x00000001U;
/** - CAN2 Port output values */
canREG2->TIOC = (uint32)((uint32)1U << 18U )
| (uint32)((uint32)0U << 17U )
| (uint32)((uint32)0U << 16U )
| (uint32)((uint32)0U << 3U )
| (uint32)((uint32)0U << 2U )
| (uint32)((uint32)0U << 1U );
canREG2->RIOC = (uint32)((uint32)1U << 18U )
| (uint32)((uint32)0U << 17U )
| (uint32)((uint32)0U << 16U )
| (uint32)((uint32)0U << 3U )
| (uint32)((uint32)0U << 2U )
| (uint32)((uint32)0U <<1U );
/** @b Initialize @b CAN3: */
/** - Setup control register
* - Disable automatic wakeup on bus activity
* - Local power down mode disabled
* - Disable DMA request lines
* - Enable global Interrupt Line 0 and 1
* - Disable debug mode
* - Release from software reset
* - Enable/Disable parity or ECC
* - Enable/Disable auto bus on timer
* - Setup message completion before entering debug state
* - Setup normal operation mode
* - Request write access to the configuration registers
* - Setup automatic retransmission of messages
* - Disable error interrupts
* - Disable status interrupts
* - Enter initialization mode
*/
canREG3->CTL = (uint32)0x00000000U
| (uint32)0x00000000U
| (uint32)((uint32)0x00000005U << 10U)
| 0x00020043U;
/** - Clear all pending error flags and reset current status */
canREG3->ES |= 0xFFFFFFFFU;
/** - Assign interrupt level for messages */
canREG3->INTMUXx[0U] = (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
| (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;
canREG3->INTMUXx[1U] = (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
| (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;
/** - Setup auto bus on timer period */
canREG3->ABOTR = (uint32)0U;
/** - Setup IF1 for data transmission
* - Wait until IF1 is ready for use
* - Set IF1 control byte
*/
/*SAFETYMCUSW 28 D MR:NA <APPROVED> "Potentially infinite loop found - Hardware Status check for execution sequence" */
while ((canREG3->IF1STAT & 0x80U) ==0x80U)
{
} /* Wait */
canREG3->IF1CMD = 0x87U;
/** - Setup IF2 for reading data
* - Wait until IF1 is ready for use
* - Set IF1 control byte
*/
/*SAFETYMCUSW 28 D MR:NA <APPROVED> "Potentially infinite loop found - Hardware Status check for execution sequence" */
while ((canREG3->IF2STAT & 0x80U) ==0x80U)
{
} /* Wait */
canREG3->IF2CMD = 0x17U;
/** - Setup bit timing
* - Setup baud rate prescaler extension
* - Setup TSeg2
* - Setup TSeg1
* - Setup sample jump width
* - Setup baud rate prescaler
*/
canREG3->BTR = (uint32)((uint32)0U << 16U) |
(uint32)((uint32)(4U - 1U) << 12U) |
(uint32)((uint32)((6U + 4U) - 1U) << 8U) |
(uint32)((uint32)(4U - 1U) << 6U) |
(uint32)(uint32)9U;
/** - CAN3 Port output values */
canREG3->TIOC = (uint32)((uint32)1U << 18U )
| (uint32)((uint32)0U << 17U )
| (uint32)((uint32)1U << 16U )
| (uint32)((uint32)0U << 3U )
| (uint32)((uint32)0U << 2U )
| (uint32)((uint32)0U << 1U );
canREG3->RIOC = (uint32)((uint32)1U << 18U )
| (uint32)((uint32)0U << 17U )
| (uint32)((uint32)1U << 16U )
| (uint32)((uint32)0U << 3U )
| (uint32)((uint32)0U << 2U )
| (uint32)((uint32)0U << 1U );
/** - Leave configuration and initialization mode */
canREG3->CTL &= ~(uint32)(0x00000041U);
/** @note This function has to be called before the driver can be used.\n
* This function has to be executed in privileged mode.\n
*/
}
From the CAN config GUI, the PDR is enabled for CAN3, but disabled for CAN2.
When you configure the GPIO pin of a microcontroller as Output. The Output pin can either be as Open-Drain type or Push-Pull Type. Both these configurations tell us how the GPIO pin of uC is designed internally.
Open-Drain Type: In open drain type there will be only one switch (transistor/MOSFET) inside the uC and this switch is connected to Ground.
Push-Pull Type: In Push-Pull type there will be two switches (transistor/MOSFET) inside the uC and one switch will be connected to Ground and the other will be connected to Vcc/Vdd.