附初始化和操作函数:
初始化(尝试三种方式,都无法正常读写):
Code: Select all
void hspi_hardware_init(void) {
/*
SpiAttr HspiInitAttr;
HspiInitAttr.mode = SpiMode_Master;
HspiInitAttr.bitOrder = SpiBitOrder_MSBFirst;
HspiInitAttr.subMode = SpiSubMode_2;
HspiInitAttr.speed = SpiSpeed_2MHz;
WRITE_PERI_REG(PERIPHS_IO_MUX, 0x005);
// WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_HSPIQ_MISO); //configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_HSPID_MOSI); //configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_HSPI_CLK); //configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_HSPI_CS0); //configure io to spi mode
CLEAR_PERI_REG_MASK(SPI_PIN(SpiNum_HSPI), SPI_CS0_DIS);
SET_PERI_REG_MASK(SPI_PIN(SpiNum_HSPI), SPI_CS1_DIS |SPI_CS2_DIS);
SPIInit(SpiNum_HSPI, &HspiInitAttr);
SPICsPinSelect(SpiNum_HSPI, SpiPinCS_0);
// SET_PERI_REG_MASK(SPI_USER(SpiNum_HSPI), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND|SPI_USR_MOSI);
// CLEAR_PERI_REG_MASK(SPI_USER(SpiNum_HSPI), SPI_FLASH_MODE);
// CLEAR_PERI_REG_MASK(SPI_CTRL(SpiNum_HSPI), SPI_QIO_MODE|SPI_DIO_MODE|SPI_DOUT_MODE|SPI_QOUT_MODE);
// WRITE_PERI_REG(SPI_CLOCK(SpiNum_HSPI),
// ((3&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
// ((1&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
// ((3&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S));
// WRITE_PERI_REG(SPI_USER1(SpiNum_HSPI),
// ((7&SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S)|
// ((7&SPI_USR_MISO_BITLEN)<<SPI_USR_MISO_BITLEN_S));*/
// hspi_overlap_init();
hspi_master_dev_init(HSPI_CS_DEV, 1, 0x1F);
hspi_dev_sel(HSPI_CS_DEV);
// PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
// GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 1);
// hspi_overlap_flash_init();
}
HSPI FLASH 操作函数:
Code: Select all
int hspi_write_data(uint32_t addr, uint32_t* data, uint32_t length) {
SpiData tspidata;
int status;
tspidata.addr = &addr;
tspidata.addrLen = 3;
tspidata.cmd = WRITE;
tspidata.cmdLen = 1;
tspidata.data = data;
tspidata.dataLen = length;
status = SPIMasterSendData(SpiNum_HSPI, &tspidata);
return status;
}
int hspi_read_data(uint32_t addr, uint32_t* data, uint32_t length) {
SpiData tspidata;
int status;
tspidata.addr = &addr;
tspidata.addrLen = 3;
tspidata.cmd = FSTREAD;
tspidata.cmdLen = 1;
tspidata.data = data;
tspidata.dataLen = length;
status = SPIMasterRecvData(SpiNum_HSPI, &tspidata);
return status;
}
int hspi_erase_sector(uint32_t addr) {
SpiData tspidata;
int status;
tspidata.addr = &addr;
tspidata.addrLen = 3;
tspidata.cmd = SE;
tspidata.cmdLen = 1;
tspidata.dataLen = 0;
// GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 0);
status = SPIMasterSendData(SpiNum_HSPI, &tspidata);
hspi_wait_for_write_finish();
// GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 1);
return status;
}
int hspi_write_enable(void) {
SpiData tspidata;
int status;
tspidata.addrLen = 0;
tspidata.cmd = WREN;
tspidata.cmdLen = 1;
tspidata.dataLen = 0;
status = SPIMasterSendData(SpiNum_HSPI, &tspidata);
return status;
}
uint8_t hspi_read_status(void) {
// SpiData tspidata;
uint32_t flash_staus;
//
// tspidata.addrLen = 0;
// tspidata.cmd = RDSR;
// tspidata.cmdLen = 1;
// tspidata.data = &flash_staus;
// tspidata.dataLen = 1;
flash_staus = SPIMasterRecvStatus(SpiNum_HSPI);
// SPIMasterRecvData(SpiNum_HSPI, &tspidata);
return flash_staus & 0xFF;
// return 0x00;
}
int hspi_wait_for_write_finish(void) {
uint32_t flash_status = 0;
do {
flash_status = hspi_read_status();
printf("FLASH STATUS ----------> 0x%X \r\n", flash_status);
vTaskDelay(100 / portTICK_RATE_MS);
} while (flash_status & 0x01 > 0);
return flash_status;
}
测试读写函数:
Code: Select all
int hspi_flash_test(uint32_t addr) {
uint8_t tbuf[64], status = 0;
uint8_t tbufchk[64] = { 0 };
uint16_t i;
spi_flash_read(0x1000, (uint32_t *)tbufchk, 64);
disp_arry(tbufchk, 64);
os_printf("spi_clk HSPI %08x\r\n", READ_PERI_REG(PERIPHS_IO_MUX));
for (i = 0; i < 64; i++)
tbuf[i] = i;
printf("FLASH ERASE SECTOR!!\r\n");
hspi_erase_sector(addr);
vTaskDelay(5000 / portTICK_RATE_MS);
flash_write_data(tbuf, addr, 64);
printf("FLASH WRITE SECTOR!!\r\n");
disp_arry(tbuf, 64);
vTaskDelay(5000 / portTICK_RATE_MS);
flash_read_data(tbufchk, addr, 64);
printf("FLASH READ SECTOR!!\r\n");
disp_arry(tbufchk, 64);
vTaskDelay(5000 / portTICK_RATE_MS);
printf("FLASH CMP DATA!!\r\n");
status = Buffercmp(tbufchk, tbuf, 64);
if (status == 0)
printf("FLASH TEST SUCCESS!!\r\n");
else
printf("FLASH TEST FAIL!!\r\n");
return status;
}
printf结果:
0x000 ---- 0x85 0xA5 0x03 0x86 0x4F 0x00 0x00 0x00
0x008 ---- 0x00 0x22 0xA0 0x00 0x10 0x31 0x20 0x42
0x010 ---- 0xA0 0x20 0x85 0x25 0x00 0x08 0x01 0x26
0x018 ---- 0x30 0x24 0x26 0x20 0x21 0x2D 0x01 0x0C
0x020 ---- 0x03 0x2C 0x04 0x01 0xEC 0xFF 0xC0 0x00
0x028 ---- 0x00 0x0C 0x42 0x31 0xCC 0xFC 0xC0 0x20
0x030 ---- 0x00 0x2C 0x04 0x22 0x63 0x4C 0x29 0x01
0x038 ---- 0x3D 0x01 0x0C 0x02 0x45 0x1D 0x00 0x0C
spi_clk HSPI 00000005
FLASH ERASE SECTOR!!
FLASH STATUS ----------> 0x0
FLASH STATUS ----------> 0x0
FLASH STATUS ----------> 0x0
FLASH WRITE SECTOR!!
0x000 ---- 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
0x008 ---- 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
0x010 ---- 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17
0x018 ---- 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F
0x020 ---- 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27
0x028 ---- 0x28 0x29 0x2A 0x2B 0x2C 0x2D 0x2E 0x2F
0x030 ---- 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37
0x038 ---- 0x38 0x39 0x3A 0x3B 0x3C 0x3D 0x3E 0x3F
FLASH READ SECTOR!!
0x000 ---- 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0x008 ---- 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0x010 ---- 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0x018 ---- 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0x020 ---- 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0x028 ---- 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0x030 ---- 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0x038 ---- 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
FLASH CMP DATA!!
FLASH TEST FAIL!!