These are commands that are not (yet) explicitly exposed in the C# and C++ library (they are constants define / enum: SPI_Command in https://github.com/Trenz-Electronic/TE-USB-Suite/blob/master/TE_USB_FX2.firmware/te_usb_api.ver.3.2/te_api.h).
SPI Flash command | Description |
---|---|
#define SPI_WREN 0x06 | Set Write Enable Latch |
#define SPI_WRDI 0x04 | Reset Write Enable Latch |
#define SPI_RDSR1 0x05 | Read Status Register 1 |
#define SPI_RDSR2 0x35 | Read Status Register 2 |
#define SPI_WRSR 0x01 | Write Status Register |
#define SPI_READ 0x03 | Read data from memory |
#define SPI_FAST_READ 0x0b | Similar to the READ command, but possibly uses a faster clock |
#define SPI_WRITE 0x02 | Write data to memory array |
#define SPI_SE 0xD8 | Erase one sector in memory |
#define SPI_BE 0xC7 | Erase all memory |
#define SPI_DP 0xb9 | Write Enable Command |
#define SPI_RES 0xab | Read Electonic Signature |
#define SPI_RDID 0x9F | reads the ID of the SPI Flash |
...
First case example (reads the ID of the SPI Flash) |
---|
...
Description | Code | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SW host computer: reads the ID of the SPI Flash This is pseudocode close to the real one.
| ||||||||||||||
FW running on USB FX2 microcontroller This is a piece of real code (FW running on USB FX2 microcontroller) https://github.com/Trenz-Electronic/TE-USB-Suite/blob/master/TE_USB_FX2.firmware/te_usb_api.ver.3.2/te_api.cLines c, lines 207-211 EP1INBUF: read Reply[] from USB FX2 microcontroller to host computer EP1OUTBUF: write Command[] from host computer to USB FX2 microcontroller Scroll Title | | |||||||||||||
| ||||||||||||||
Flash | Manufacturer ID | Memory Type | Capacity | |||||||||||
M25P32 | 20h - Micron | 20h | 16h | W25Q64FV | EFh - Winbond | 40h | 17h
Code Block | ||||
---|---|---|---|---|
| ||||
case CMD_FLASH_WRITE_COMMAND: EP1INBUF[0] = 0x55; //void spi_command(BYTE CmdLen, unsigned char *CmdData, BYTE RdLen, unsigned char *RdData) spi_command(EP1OUTBUF[1], &EP1OUTBUF[3], EP1OUTBUF[2], &EP1INBUF[1]); new_data = 1; break; /* Command[0] = CMD_FLASH_WRITE_COMMAND; used by TE_USB_FX2_SendCommand () to call "case CMD_FLASH_WRITE_COMMAND" and then spi_command() EP1OUTBUF[1] = CmdLen = Command[1]= CmdLength = 1; // used by spi_command(), MD_SPI_RDID = 0x9F is a single byte EP1OUTBUF[2] = RdLen = Command[2]= ReplyLength = 3; // used by spi_command(), SPI Flash ID should be 3 byte EP1OUTBUF[3] = Command[3] = CMD_SPI_RDID = 0x9F; //used by spi_command() Â Reply[0] = EP1INBUF[0] = 0x55; Reply[1] = EP1INBUF[1] = 0x20; // for example Reply[2] = EP1INBUF[2] = 0x20; // for example Reply[3] = EP1INBUF[3] = 0x16; // for example */ |
Scroll Title | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
|
FW running on USB FX2 microcontroller
This is a piece of real code
https://github.com/Trenz-Electronic/TE-USB-Suite/blob/master/TE_USB_FX2.firmware/te_usb_api.ver.3.2/spi.cLines , lines 63-89
Code Block | ||||
---|---|---|---|---|
| ||||
void spi_command(BYTE CmdLen, unsigned char *CmdData, BYTE RdLen, unsigned char *RdData) { volatile unsigned char spi_count, rd_buff;// pr_address; OED = 0x73; // 0b01110011; FPGA_POWER = 0; //power off fpga FLASH_ENABLE; //assert chip select //Write command spi_count = CmdLen; if (spi_count > 64) spi_count = 64; while (spi_count > 0) { putcSPI(*CmdData); //send read command CmdData++; spi_count = spi_count - 1; } //Read response spi_count = RdLen; if (spi_count > 64) spi_count = 64; while (spi_count > 0) { rd_buff = getcSPI(); *RdData = rd_buff; RdData++; spi_count = spi_count - 1; } FLASH_DISABLE; } |
d
...