四、优化延时时间
延时100ms保证了在运行代码CANFDSPI_Init的时候,MCP2517一定是准备好的。为了减少板子的上电初始化时间做了下面的工作。因为STM32和MCP2517都是使用3V3,对于MCP2517,只要3V3电源上升到2.7V即可正常工作(POR电压为2.65V),对于STM32的POR电压为1.67V。针对这一个BUG,解决方法的核心是:在运行代码CANFDSPI_Init的时候,3V3的电压一定要上升到2V7以上,这样子才能完成对MCP2517的初始化。
与其推导加多少延时,MCP2517可以正常工作,不妨进行验证,延迟xms时,运行到CANFDSPI_Init时,VDD_MCP2517的电压为为多少。确定了方案之后进行多次测试,发现不延时异常,加延时1ms正常。
首先测试加延时1ms,运行改行代码时,3V3的电源上升到电压多少。代码如下,使用示波器触发功能触发PB2,下降沿触发,同时测试3V3。加1ms延时测试到的VDD_MCP2517结果如图6,电压为2.88V>2.7V,所以可以正常工作。
int main(void)
{
MX_GPIO_Init(); //GPIO初始化,PB1和PB2默认输出低
MX_SPI3_Init(); //SPI3控制CANFD芯片MCP2517
PB2_Low(); //拉高PB2
HAL_Delay(1); //延时1ms
CANFDSPI_Init(); //初始化CAN FD
while(1)
{
HAL_Delay(20); //延时20ms
GPIO_PB1_CHANGE();//翻转PB1引脚查看程序是否在运行
test_fdcan_send();//测试CANFD发送
}
}
图6
注释掉延时1ms,此时重启电源后,MCP2517不能正常工作,测试结果如图7所示,VDD_MCP2517的电平为2.52V<2.7V,所以不正常。 int main(void) { MX_GPIO_Init(); //GPIO初始化,PB1和PB2默认输出低 MX_SPI3_Init(); //SPI3控制CANFD芯片MCP2517 PB2_Low(); //拉高PB2 //HAL_Delay(1); //延时1ms CANFDSPI_Init(); //初始化CAN FD while(1) { HAL_Delay(20); //延时20ms GPIO_PB1_CHANGE();//翻转PB1引脚查看程序是否在运行 test_fdcan_send();//测试CANFD发送 } }
|