#include "AT45DB.h" #define StatusReg 0xD7 #define WAIT(x) for(uint8_t i = 0; i < x; i++){} extern SPI_HandleTypeDef hspi3; uint8_t FlashCommand[8]; void spiTransmit(uint8_t *data, uint16_t len) { HAL_SPI_Transmit(&hspi3, data, len, 5000); // uint8_t f; // while(SPI3->SR & SPI_SR_BSY); // for(uint16_t i = 0; i < len; i++){ // SPI3->DR = *data++; // while(!(SPI3->SR & SPI_SR_TXE)); // while(!(SPI3->SR & SPI_SR_RXNE)); // f = SPI3->DR; // } } void spiReceive(uint8_t *data, uint16_t len) { HAL_SPI_Receive(&hspi3, data, len, 5000); // while(SPI3->SR & SPI_SR_BSY); // for(uint16_t i = 0; i < len; i++){ // SPI3->DR = 0x00; // while(!(SPI3->SR & SPI_SR_TXE)); // while(!(SPI3->SR & SPI_SR_RXNE)); // *data++ = SPI3->DR; // } } uint8_t ReadStatusFlash (void) { uint8_t FlashStatus; FlashCommand[0] = StatusReg; FLASH_CS_SET; // __ASM("nop"); spiTransmit(FlashCommand, 1); spiReceive(&FlashStatus, 1); //HAL_SPI_Transmit(&hspi3, FlashCommand, 1, 500); // HAL_SPI_Receive(&hspi3, &FlashStatus, 1, 500); FLASH_CS_RESET; WAIT(5); return FlashStatus; } void Flash_StatusRDY (void) { uint8_t FlashStatus; FlashCommand[0] = StatusReg; FLASH_CS_SET; // __ASM("nop"); spiTransmit( FlashCommand, 1); //HAL_SPI_Transmit(&hspi3, FlashCommand, 1, 500); do{ spiReceive(&FlashStatus, 1); //HAL_SPI_Receive(&hspi3, &FlashStatus, 1, 500); }while(!(FlashStatus & 0x80)); FLASH_CS_RESET; WAIT(5); } void Flash_SetPage512(void) { FlashCommand[0] = 0x3D; FlashCommand[1] = 0x2A; FlashCommand[2] = 0x80; FlashCommand[3] = 0xA6; FLASH_CS_SET; //__ASM("nop"); spiTransmit(FlashCommand, 4); // HAL_SPI_Transmit(&hspi3, FlashCommand, 4, 500); FLASH_CS_RESET; WAIT(5); Flash_StatusRDY(); } void Flash_FullErase(void) { FlashCommand[0] = 0xC7; FlashCommand[1] = 0x94; FlashCommand[2] = 0x80; FlashCommand[3] = 0x9A; FLASH_CS_SET; //__ASM("nop"); spiTransmit(FlashCommand, 4); //HAL_SPI_Transmit(&hspi3, FlashCommand, 4, 500); FLASH_CS_RESET; WAIT(5); Flash_StatusRDY(); } void Flash_ByteWrite(uint32_t bADDR, uint16_t num, uint8_t *TXdata) { uint32_t Pg_ADDR,Byte_ADDR ; Pg_ADDR = bADDR & 0x3FFE00 ; Byte_ADDR = bADDR & 0x0001FF ; Flash_StatusRDY(); FlashCommand[0] = 0x53; FlashCommand[1] = (uint8_t)(Pg_ADDR>>16); FlashCommand[2] = (uint8_t)(Pg_ADDR>>8); FlashCommand[3] = (uint8_t)(Pg_ADDR); FLASH_CS_SET; //__ASM("nop"); spiTransmit(FlashCommand, 4); //HAL_SPI_Transmit(&hspi3, FlashCommand, 4, 500); FLASH_CS_RESET; WAIT(5); Flash_StatusRDY(); FlashCommand[0] = 0x84; FlashCommand[1] = (uint8_t)(Byte_ADDR>>16); FlashCommand[2] = (uint8_t)(Byte_ADDR>>8); FlashCommand[3] = (uint8_t)(Byte_ADDR); FLASH_CS_SET; // __ASM("nop"); spiTransmit(FlashCommand, 4); spiTransmit(TXdata, num); //HAL_SPI_Transmit(&hspi3, FlashCommand, 4, 500); //HAL_SPI_Transmit(&hspi3, TXdata, num, 5000); FLASH_CS_RESET; WAIT(5); Flash_StatusRDY(); FlashCommand[0] = 0x83; FlashCommand[1] = (uint8_t)(Pg_ADDR>>16); FlashCommand[2] = (uint8_t)(Pg_ADDR>>8); FlashCommand[3] = (uint8_t)(Pg_ADDR); FLASH_CS_SET; //__ASM("nop"); spiTransmit(FlashCommand, 4); //HAL_SPI_Transmit(&hspi3, FlashCommand, 4, 500); FLASH_CS_RESET; WAIT(5); } void Flash_Read(uint32_t bADDR, uint16_t num, uint8_t *RXdata) { Flash_StatusRDY(); FlashCommand[0] = 0xE8; FlashCommand[1] = (uint8_t)(bADDR>>16); FlashCommand[2] = (uint8_t)(bADDR>>8); FlashCommand[3] = (uint8_t)(bADDR); FlashCommand[4] = 0x00; FlashCommand[5] = 0x00; FlashCommand[6] = 0x00; FlashCommand[7] = 0x00; FLASH_CS_SET; //__ASM("nop"); spiTransmit(FlashCommand, 8); spiReceive(RXdata, num); //HAL_SPI_Transmit(&hspi3, FlashCommand, 8, 500); // HAL_SPI_Receive(&hspi3, RXdata, num, 5000); FLASH_CS_RESET; WAIT(5); } void Flash_PageErase(uint16_t page) // page 0 - 8191 { uint32_t Pg_ADDR = 0x00000000; Pg_ADDR = (page << 9); FlashCommand[0] = 0x81; FlashCommand[1] = (uint8_t)(Pg_ADDR>>16); FlashCommand[2] = (uint8_t)(Pg_ADDR>>8); FlashCommand[3] = (uint8_t)(Pg_ADDR); FLASH_CS_SET; //__ASM("nop"); spiTransmit(FlashCommand, 4); //HAL_SPI_Transmit(&hspi3, FlashCommand, 4, 500); FLASH_CS_RESET; WAIT(5); Flash_StatusRDY(); } void Flash_Read_ID(uint8_t *ID) { Flash_StatusRDY(); FlashCommand[0] = 0x9F; FLASH_CS_SET; // __ASM("nop"); spiTransmit(FlashCommand, 1); spiReceive(ID, 4); //HAL_SPI_Transmit(&hspi3, FlashCommand, 1, 500); //HAL_SPI_Receive(&hspi3, ID, 4, 500); FLASH_CS_RESET; WAIT(5); }