JTAG Flash编程


Flash可以通过四个间接寄存器访问:FLASHCON、FLASHADR、FLASHDAT和FLASHSCL。每个寄存器通过间接读和间接写来访问。

FLASHCON

FLASHCON是一个8-bit寄存器,用于控制FLASH逻辑应答对FLASHDAT寄存器的读和写。FLASHCON寄存器由ReadMode和WriteMode设置组成,具体如下:

7:4 3:0
WriteMode ReadMode
ReadMode 描述
0000 FLBUSY Polling
0010 Initiate FLASH read;Increment FLASHADR

注:未注明的状态都是保留状态

WriteMode 描述
0000 FLBUSY Polling
0001 Initiate FLASH Write;Increment FLASHADR
0010 Initiate page erase on current page if FLASHDAT = 0xA5; Initiate erase of entire FLASH if FLASHDAT = 0xA5 and FLASHADR is set to the address of the FLASH Read Lock Byte or the FLASH Write/Erase Lock Byte.

注:未注明的状态都是保留状态

FLASHADR

FLASHADR是一个16bit位宽的寄存器,用于指定读操作或写操作的目的地址。FLASHADR在完成一次读操作或写操作后会自动增加。

FLASHDAT

FLASHDAT是一个10-bit位宽的寄存器,包含8bit数据,1bit FLFail和1bit的FLBusy。

9:2 1 0
FLData FLFail FLBusy

对FLASHDAT写操作仅仅需要8bit,因为被锁存的最后一位假定是MSB位置。

对FLASHDAT读操作要求11个DR_SHIFT周期,8Cycle用于FLDATA,1个周期用于FLFail,1个周期用于FLBusy,1个周期用于Busy。

FLBusy轮询需要至少两个DR_SHIFT周期,一个周期用于FLBust,另一个周期用于Busy。

FLASHSCL

FLASHSCL是一个8bit寄存器,用于设置FLASH操作时序所需要的预分频值。当工作在内部2MHz系统时钟时,该寄存器应该配置为0x86.

7:4 3:0
1000 0110

FLASH访问流程

在FLASH被编程前,设备需要被复位,看门狗需要被设置为离线模式,否则看门狗可能在FLASH编程过程中发起系统复位,进而导致不确定的行为。

禁用看门狗定时器(WDT)

流程图显示了禁用看门狗定时器的过程,整个过程如下:

  1. 系统通过加载0x2FFF到指令寄存器迫使系统复位;
  2. 加载0x1004到指令寄存器读取IDCODE,通过在TDI写入0x0000_0000,从而在接收端TDO获得IDCODE;
  3. 所有后续的指令地址都需要设置StateCntl为0x4,这样使得CPU核处于SUSPEND状态,使得FLASH处于Off-Line。

JTAG Flash编程

读取FLASH内部的一个字节

具体流程如下:

  1. 加载0x86到FLASHSCL,使用内部2MHz系统时钟设置合适的FLASH时序。这可以通过一个对FLASHSCL的间接写0x86来实现;
  2. 将读操作的目标地址加载到FLASHADR;
  3. 加载0x01到FLASHCON,发起一次读操作;
  4. 通过读FLASHDAT发起读,这是一次间接读0bit操作;
  5. 加载0x00到FLASHCON来轮询FLBusy,查看是否处于忙状态;
  6. 轮询FLBusy直到该信号变低,表示读操作已完成;
  7. 读FLASHDAT;

JTAG Flash编程