1
0
mirror of https://gitee.com/HEYAHONG/SPI_Flasher_Via_STM32.git synced 2025-05-08 19:06:55 +08:00
2020-04-01 14:38:10 +08:00
..
2020-03-20 15:14:27 +08:00
2020-03-24 14:23:53 +08:00
2020-03-24 12:03:43 +08:00
2020-03-24 15:58:47 +08:00
2020-03-24 13:36:03 +08:00
2020-04-01 14:38:10 +08:00
2020-04-01 14:38:10 +08:00
2020-04-01 14:38:10 +08:00
2020-03-24 11:41:33 +08:00
2020-03-24 11:41:33 +08:00
2020-03-24 11:41:33 +08:00
2020-03-24 13:36:03 +08:00
2020-03-20 15:26:37 +08:00

本工程为一个USB烧录器主要功能为烧录SPI Flash和I2C EEPROM也提供一些附属功能。

全部功能如下:

  • 支持极其有限的USB转串口功能用于调试。
  • USB虚拟串口转SPI功能
  • SPI Flash烧写功能主要为w25q80及其兼容器件
  • USB虚拟串口转I2C
  • I2C EEPROM烧写功能主要为AT24C64及其兼容器件

软件部分

在本工程中USB被配置为虚拟串口功能(属于USB CDC),一般情况下是免驱的,已测试平台:

  • Windows 10
  • ubuntu 19.04

当硬件被接入时会自动安装通用驱动在Windows 10下会分配一个串口号COMx(x为不固定的数字值)在linux下会被udev自动分配到/dev/ttyACMx(x为不固定的数字值)。此时,便可以像操作普通串口设备一样操作硬件。

windows识别CDC ACM设备

linux识别CDC ACM设备

在本工程中通过上位机设置的串口参数区分不同的模式,模式区分如下:

  • 串口模式上位机设置的串口波特率小于1500000用于有限的USB转串口功能。
  • 原始模式SPI上位机设置的串口波特率大于等于2000000且停止位设置为1位提供原始的USB虚拟串口转SPI功能。
  • 命令模式SPI上位机设置的串口波特率大于等于2000000且停止位设置不为1位此时上位机发送的数据将被解析然后调用内置的函数通过SPI对Flash进行操作可以提高读写速率。
  • 原始模式I2C上位机设置的串口波特率大于等于1500000小于2000000且停止位设置为1位提供原始的USB虚拟串口转I2C功能。
  • 命令模式I2C上位机设置的串口波特率大于等于1500000小于2000000且停止位设置不为1位此时上位机发送的数据将被解析然后调用内置的函数通过I2C对EEPROM进行操作可以提高读写速率。

当在串口助手上调试时所有操作均需要在hex模式下进行不能直接发送字符串。

串口模式

此时将会尽可能使用上位机对串口的设置(停止位、校验位、数据长度、波特率等)对UART2进行设置上位机发送的数据将会直接从UART2发送UART2接收的数据也将直接发送给上位机。

原始模式SPI

此时将会直接将从上位机接收的数据从SPI的MOSI发送出去同时从MISO接收的数据也将直接返回给上位机。在一次通信中上位机发送的数据长度应该为发送给SPI从器件的命令长度加上SPI从器件返回的数据长度发送给上位机的长度同上位机发送的长度上位机接收的数据前半部分是发送时从器件发送的数据(一般是无效的),后半部分才是真正的有效数据。

例: SPI Flash可以通过读芯片ID判断容量发送9f将返回3字节包含厂商代码和芯片ID.

w25q80

读取芯片SPI Flash ID

命令模式SPI

上位机发送的数据将被解析第一个字节将会被认为是命令号硬件通过这个命令号执行不同的函数出错时返回的数据的第一个字节为0xff。

Mode_SPI_CMD表
注意:串口发送数据长度大于64字节时将不稳定
命令号 参数1 参数2 参数3 参数4 成功返回长度 说明
占用长度 说明 占用长度 说明 占用长度 说明 占用长度 说明
0 1 CPOL,为0时为SPI_POLARITY_LOW 1 CPHA为0时为SPI_PHASE_1EDGE 1 位序为0时为SPI_FIRSTBIT_MSB     同发送长度 设置SPI通信参数
1                 1+40 初始化SPI Flash通信读写/擦除前必须执行此命令,返回的数据为配置结构体的内容。
2                 同发送长度 擦除整个SPI Flash芯片W25qxx_EraseChip
3 4 扇区地址,小端模式             同发送长度 按扇区擦除SPI Flash芯片,W25qxx_EraseSector
4 4 块地址,小端模式             同发送长度 按块擦除SPI Flash芯片,W25qxx_EraseBlock
5 4 地址,小端模式 4 偏移,小端模式 4 数量,小端模式     同发送长度 检查页是否为空,,W25qxx_IsEmptyPage
6 4 地址,小端模式 4 偏移,小端模式 4 数量,小端模式     同发送长度 检查扇区是否为空W25qxx_IsEmptySector
7 4 地址,小端模式 4 偏移,小端模式 4 数量,小端模式     同发送长度 检查块是否为空W25qxx_IsEmptyBlock
8 4 地址,小端模式 1 待写入的数据         同发送长度 写入1字节数据W25qxx_WriteByte
9 4 地址,小端模式 4 偏移,小端模式 至帧结束 待写入的数据     同发送长度 按页写入数据W25qxx_WritePage
10 4 地址,小端模式 4 偏移,小端模式 至帧结束 待写入的数据     同发送长度 按扇区写入数据W25qxx_WriteSector
11 4 地址,小端模式 4 偏移,小端模式 至帧结束 待写入的数据     同发送长度 按块写入数据W25qxx_WriteBlock
12 4 地址,小端模式             5+1 读取1字节数据数据在末尾W25qxx_ReadByte
13 4 地址,小端模式 4 数量,小端模式         9+参数2 读取多字节数据数据在末尾W26qxx_ReadBytes
14 4 地址,小端模式 4 偏移,小端模式 4 数量,小端模式     13+参数3 按页读多字节数据数据在末尾W25qxx_ReadPage
15 4 地址,小端模式 4 偏移,小端模式 4 数量,小端模式     13+参数3 按扇区读多字节数据数据在末尾W25qxx_ReadSector
16 4 地址,小端模式 4 偏移,小端模式 4 数量,小端模式     13+参数3 按块读多字节数据数据在末尾W25qxx_ReadBlock

原始模式I2C

帧格式: I2C器件地址+待发送/接收的的数据其中器件地址为8位地址(最低位表示读(1)/写(0)),待发送/接收的由帧长度-1的值确定。

当使用I2C操作EEPROM AT24C64时地址为A1/A0(写)。

进行读操作时,无需发送读取地址,自动从当前地址读帧长度-1个字符。需要改变地址时需要使用写操作(不写入任何数据)。

进行写操作时除需要器件地址外待发送的数据前2字节为写入/读取地址(地址高字节在前),后面才是实际写入的数据(长度为帧长度-3当写入数据不存在时仅改变地址。注意写入数据时不会自动跨页如需跨页要分为多次写操作。

原始模式I2C

命令模式I2C

上位机发送的数据将被解析第一个字节将会被认为是命令号硬件通过这个命令号执行不同的函数出错时返回的数据的第一个字节为0xff。

Mode_I2C_CMD表
注意:串口发送数据长度大于64字节时将不稳定
命令号 参数1 参数2 参数3 参数4 成功返回长度 说明
占用长度 说明 占用长度 说明 占用长度 说明 占用长度 说明
1 2 低字节在前表示EEPROM容量(KBit)             同发送长度 设置EEPROM容量大小检测EEPROM是否存在
2 2 低字节在前,起始地址 2 低字节在前,读取长度         参数2+1 读取EEPROM内容
3 2 低字节在前,起始地址 至帧结束 待写入数据         同发送长度 写EEPROM内容

硬件部分

硬件部分主要由一块带USB接口的主板和各种封装转DIP-8座组成。

主板图片

注意:主板外形会随着PCB工艺选择性焊接和硬件设计版本的不同而不同但最主要的USB接口和插座接口均不会缺少。

由于有很多EEPROM和SPI Flash并不是DIP-8封装的因此需要转接插座才能安装到主板上。

SOP-8转DIP-8插座主要用于安装w25q80

SOP-8座

TSSOP-8转DIP-8座(主要用于安装AT24C64)

TSSOP-8座

注意:芯片安装时1脚的位置要正确否则可能烧坏芯片接反时芯片电源和地会对调

上位机软件

上位机软件主要是用于EEPROM和Flash的烧录一般只使用命令模式SPI和命令模式I2C。除此之外其它模式基本上只是用于调试只需要使用串口调试助手。

24C64 EEPROM的烧写 烧写I2C_EEPROM

w25q80 flash的烧写部分操作耗时较长进行了快进 烧写SPI_Flash