在线时间9 小时
UID3540880
注册时间2019-2-27
NXP金币0
该用户从未签到
新手上路

- 积分
- 46
- 最后登录
- 2020-5-29
|
FSL_LIN_2.x_STACK_Package_4.5.9软件包中调用lin_lld_uart_int_disable会进入死循环;
我用的芯片是KEA128,KDS编译器, 移植了官方的FSL_LIN_2.x_STACK_Package_4.5.9 软件包,因为在应用程序中需要对flash写操作,写flash之前需要先关闭全局中断,但是直接关全局中断,flash写完后恢复全局中断,lin通讯无法恢复,后来我使用FSL_LIN_2.x_STACK_Package_4.5.9 中自带的函数先关闭lin,再关闭全局中断,lin通讯能恢复,代码如下,但偶尔会在调用lin_lld_uart_int_disable()时进入死循环,进入死循环时,仿真查看程序停留在
while(state != IDLE)
{}
state = RECV_SYN;
请教下有什么办法解决这个问题?
写flash程序:
if((FLASH_LOCATION_K % FLASH_SECTOR_SIZE) == 0)
{
WDog1_Clear(MyWDog1Ptr); /* Clear watchdog timer */
l_sys_irq_disable(LI0);
//__disable_irq();
__DI();
//__DI();
//__DI(); /* Disable interrupts */ // 直锟接斤拷止锟叫断猴拷通讯锟睫凤拷锟街革拷 鍟婂晩鍟?
#if 1
FLASH_EraseSector(FLASH_LOCATION_K);
if (FLASH_Program(FLASH_LOCATION_K, buff, len+4) != FLASH_ERR_SUCCESS)
{
res = 0xFF;
autoCalibration.error |= ERROR_BIT4; // 锟斤拷锟斤拷flash锟斤拷锟斤拷 test...
}
else
{
autoCalibration.test++;
}
#endif
lin_goto_idle_state();
l_sys_irq_restore(LI0);
//__enable_irq();
__EI(); /* Enable interrupts */ // 锟斤拷锟铰匡拷锟叫断猴拷时锟斤拷锟睫凤拷锟斤拷锟叫o拷 flash写锟斤拷锟斤拷锟斤拷锟斤拷锟轿灰伙拷危锟?
//__EI();
//__EI();
//sSW_Reset(); // 锟斤拷位锟斤拷锟斤拷锟絣_sys_irq_disable 锟截憋拷LIN锟叫断撅拷山锟斤拷锟斤拷锟铰匡拷锟叫讹拷锟睫凤拷锟街革拷通讯锟斤拷锟斤拷
}
#define IDLE 0x00 /**< IDLE state */
#define SEND_BREAK 0x01 /**< Send break field state */
#define SEND_PID 0x02 /**< send PID state */
#define RECV_SYN 0x03 /**< receive synchronize state */
#define RECV_PID 0x04 /**< receive PID state */
#define IGNORE_DATA 0x05 /**< ignore data state */
#define RECV_DATA 0x06 /**< receive data state */
#define SEND_DATA 0x07 /**< send data state */
#define SEND_DATA_COMPLETED 0x08 /**< send data completed state */
#define PROC_CALLBACK 0x09 /**< proceduce callback state */
#define SLEEP_MODE 0x0A /**< sleep mode state */
#define UNINIT 0xFF /**< uninitialize state */
void lin_lld_uart_int_disable
(
)
{
/*--------------------------------------------------------------------*/
/* Can't disable in interrupt context */
if ((state == PROC_CALLBACK) || (state == UNINIT) || (state == SLEEP_MODE))
{
return;
}
while(state != IDLE)
{}
/* Disable UART Channel */
pUART->uartcr2.byte &= ~(UARTCR2_RE_MASK | UARTCR2_RIE_MASK);
/* Disable timeout interrupt 0 channel */
} /* End function lin_lld_UART_int_disable() */
最佳答案
shuxmpx123 发表于 2019-3-5 16:33
恩 问题是我不知道LIN数据什么时候处理好,直接关闭UART的话,如果正在接收或发送数据帧,就可能导致LIN ...
楼主你好,刚才我帮你问了我们汽车team的一个比较熟悉LIN ...
|
|