FX3/CX3 编程实现usb启动更新固件

来源:互联网 发布:apache cxf 2.5.9 编辑:程序博客网 时间:2024/06/03 18:00

FX3/CX3 有很多种启动方式,SPI启动,I2C 启动,还有usb启动等。
烧写程序是需要从usb启动的,但是运行程序则是要在spi或i2c启动(要么是spi flash,要么是 i2c eeprom)。
所以要更新固件(usb驱动),必须修改启动方式,板子要么弄几个拨码开关选择启动方式,要么每次都用电烙铁修改(特麻烦),要么选择编程方式实现。


编程方式实现的原理就是如果spi或i2c启动失败,就会从usb启动,参见文档说明。
所以上电后,我们的代码先判断引脚状态,如果是我们所希望的状态(比如引脚默认高电平,低电平则表示设置为usb启动),
如果是低电平,我们就执行代码,修改spi flash或i2c eeprom的起始代码,故意引起SPI/I2C 启动失败,失败后就会usb启动,这样我们就可以
通过usb control center来下载程序了。

鄙人用的是spi flash,所以代码参考上一遍读写flash。
当然也可以用usb vendor command 实现破坏起始代码。

const static uint8_t buf_WIP[10]={0};status = CyFxSpiEraseSector(CyTrue,0,buf_WIP);if (status != CY_U3P_SUCCESS){return ;}CyU3PDeviceReset(CyFalse);

// CyU3PUsbAckSetup ();//rx ok,return ack packet.
CyU3PUsbSendEP0Data (8, (uint8_t *)glFirmwareID);

用usblyzer可以看到发送的数据,通过usb hound也可以发送自定义usb指令。