35 #define SPIM_DMM_MAP_ADDR 0x8000000UL 36 #define SPIM_DMM_SIZE 0x2000000UL 37 #define SPIM_CCM_ADDR 0x20020000UL 38 #define SPIM_CCM_SIZE 0x8000UL 43 #define SPIM_CTL0_RW_IN(x) ((x) ? 0UL : (0x1UL << SPIM_CTL0_QDIODIR_Pos)) 44 #define SPIM_CTL0_BITMODE_SING (0UL << SPIM_CTL0_BITMODE_Pos) 45 #define SPIM_CTL0_BITMODE_DUAL (1UL << SPIM_CTL0_BITMODE_Pos) 46 #define SPIM_CTL0_BITMODE_QUAD (2UL << SPIM_CTL0_BITMODE_Pos) 47 #define SPIM_CTL0_OPMODE_IO (0UL << SPIM_CTL0_OPMODE_Pos) 48 #define SPIM_CTL0_OPMODE_PAGEWRITE (1UL << SPIM_CTL0_OPMODE_Pos) 49 #define SPIM_CTL0_OPMODE_PAGEREAD (2UL << SPIM_CTL0_OPMODE_Pos) 50 #define SPIM_CTL0_OPMODE_DIRECTMAP (3UL << SPIM_CTL0_OPMODE_Pos) 52 #define CMD_NORMAL_PAGE_PROGRAM (0x02UL << SPIM_CTL0_CMDCODE_Pos) 53 #define CMD_NORMAL_PAGE_PROGRAM_4B (0x12UL << SPIM_CTL0_CMDCODE_Pos) 54 #define CMD_QUAD_PAGE_PROGRAM_WINBOND (0x32UL << SPIM_CTL0_CMDCODE_Pos) 55 #define CMD_QUAD_PAGE_PROGRAM_MXIC (0x38UL << SPIM_CTL0_CMDCODE_Pos) 56 #define CMD_QUAD_PAGE_PROGRAM_EON (0x40UL << SPIM_CTL0_CMDCODE_Pos) 58 #define CMD_DMA_NORMAL_READ (0x03UL << SPIM_CTL0_CMDCODE_Pos) 59 #define CMD_DMA_FAST_READ (0x0BUL << SPIM_CTL0_CMDCODE_Pos) 60 #define CMD_DMA_NORMAL_DUAL_READ (0x3BUL << SPIM_CTL0_CMDCODE_Pos) 61 #define CMD_DMA_FAST_READ_DUAL_OUTPUT (0x3BUL << SPIM_CTL0_CMDCODE_Pos) 62 #define CMD_DMA_FAST_READ_QUAD_OUTPUT (0x6BUL << SPIM_CTL0_CMDCODE_Pos) 63 #define CMD_DMA_FAST_DUAL_READ (0xBBUL << SPIM_CTL0_CMDCODE_Pos) 64 #define CMD_DMA_NORMAL_QUAD_READ (0xE7UL << SPIM_CTL0_CMDCODE_Pos) 65 #define CMD_DMA_FAST_QUAD_READ (0xEBUL << SPIM_CTL0_CMDCODE_Pos) 72 MFGID_SPANSION = 0x01U,
81 #define OPCODE_WREN 0x06U 82 #define OPCODE_RDSR 0x05U 83 #define OPCODE_WRSR 0x01U 84 #define OPCODE_RDSR2 0x35U 85 #define OPCODE_WRSR2 0x31U 86 #define OPCODE_RDSR3 0x15U 87 #define OPCODE_WRSR3 0x11U 88 #define OPCODE_PP 0x02U 89 #define OPCODE_SE_4K 0x20U 90 #define OPCODE_BE_32K 0x52U 91 #define OPCODE_CHIP_ERASE 0xc7U 92 #define OPCODE_BE_64K 0xd8U 93 #define OPCODE_READ_ID 0x90U 94 #define OPCODE_RDID 0x9fU 95 #define OPCODE_BRRD 0x16U 96 #define OPCODE_BRWR 0x17U 97 #define OPCODE_NORM_READ 0x03U 98 #define OPCODE_FAST_READ 0x0bU 99 #define OPCODE_FAST_DUAL_READ 0x3bU 100 #define OPCODE_FAST_QUAD_READ 0x6bU 103 #define OPCODE_BP 0x02U 104 #define OPCODE_WRDI 0x04U 105 #define OPCODE_AAI_WP 0xadU 108 #define OPCODE_EN4B 0xb7U 109 #define OPCODE_EX4B 0xe9U 111 #define OPCODE_RDSCUR 0x2bU 112 #define OPCODE_WRSCUR 0x2fU 114 #define OPCODE_RSTEN 0x66U 115 #define OPCODE_RST 0x99U 117 #define OPCODE_ENQPI 0x38U 118 #define OPCODE_EXQPI 0xFFU 130 #define SR_SRWD 0x80U 131 #define SR3_ADR 0x01U 133 #define SCUR_4BYTE 0x04U 153 #define SPIM_ENABLE_CIPHER() (SPIM->CTL0 &= ~SPIM_CTL0_CIPHOFF_Msk) 159 #define SPIM_DISABLE_CIPHER() (SPIM->CTL0 |= SPIM_CTL0_CIPHOFF_Msk) 165 #define SPIM_ENABLE_BALEN() (SPIM->CTL0 |= SPIM_CTL0_BALEN_Msk) 171 #define SPIM_DISABLE_BALEN() (SPIM->CTL0 &= ~SPIM_CTL0_BALEN_Msk) 177 #define SPIM_SET_4BYTE_ADDR_EN(x) \ 179 SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_B4ADDREN_Msk)) | (((x) ? 1UL : 0UL) << SPIM_CTL0_B4ADDREN_Pos); \ 186 #define SPIM_ENABLE_INT() (SPIM->CTL0 |= SPIM_CTL0_IEN_Msk) 192 #define SPIM_DISABLE_INT() (SPIM->CTL0 &= ~SPIM_CTL0_IEN_Msk) 198 #define SPIM_IS_IF_ON() ((SPIM->CTL0 & SPIM_CTL0_IF_Msk) != 0UL) 204 #define SPIM_CLR_INT() \ 206 SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_IF_Msk)) | (1UL << SPIM_CTL0_IF_Pos); \ 213 #define SPIM_SET_DATA_WIDTH(x) \ 215 SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_DWIDTH_Msk)) | (((x) - 1U) << SPIM_CTL0_DWIDTH_Pos); \ 222 #define SPIM_GET_DATA_WIDTH() \ 223 (((SPIM->CTL0 & SPIM_CTL0_DWIDTH_Msk) >> SPIM_CTL0_DWIDTH_Pos)+1U) 229 #define SPIM_SET_DATA_NUM(x) \ 231 SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_BURSTNUM_Msk)) | (((x) - 1U) << SPIM_CTL0_BURSTNUM_Pos); \ 238 #define SPIM_GET_DATA_NUM() \ 239 (((SPIM->CTL0 & SPIM_CTL0_BURSTNUM_Msk) >> SPIM_CTL0_BURSTNUM_Pos)+1U) 245 #define SPIM_ENABLE_SING_INPUT_MODE() \ 247 SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_SING | SPIM_CTL0_RW_IN(1)); \ 254 #define SPIM_ENABLE_SING_OUTPUT_MODE() \ 256 SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_SING | SPIM_CTL0_RW_IN(0)); \ 263 #define SPIM_ENABLE_DUAL_INPUT_MODE() \ 265 SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_DUAL | SPIM_CTL0_RW_IN(1U)); \ 272 #define SPIM_ENABLE_DUAL_OUTPUT_MODE() \ 274 SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_DUAL | SPIM_CTL0_RW_IN(0U)); \ 281 #define SPIM_ENABLE_QUAD_INPUT_MODE() \ 283 SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_QUAD | SPIM_CTL0_RW_IN(1U)); \ 290 #define SPIM_ENABLE_QUAD_OUTPUT_MODE() \ 292 SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_QUAD | SPIM_CTL0_RW_IN(0U)); \ 299 #define SPIM_SET_SUSP_INTVL(x) \ 301 SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_SUSPITV_Msk)) | ((x) << SPIM_CTL0_SUSPITV_Pos); \ 308 #define SPIM_GET_SUSP_INTVL() \ 309 ((SPIM->CTL0 & SPIM_CTL0_SUSPITV_Msk) >> SPIM_CTL0_SUSPITV_Pos) 315 #define SPIM_SET_OPMODE(x) \ 317 SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_OPMODE_Msk)) | (x); \ 324 #define SPIM_GET_OP_MODE() (SPIM->CTL0 & SPIM_CTL0_OPMODE_Msk) 330 #define SPIM_SET_SPIM_MODE(x) \ 332 SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_CMDCODE_Msk)) | (x); \ 339 #define SPIM_GET_SPIM_MODE() (SPIM->CTL0 & SPIM_CTL0_CMDCODE_Msk) 345 #define SPIM_SET_GO() (SPIM->CTL1 |= SPIM_CTL1_SPIMEN_Msk) 351 #define SPIM_IS_BUSY() (SPIM->CTL1 & SPIM_CTL1_SPIMEN_Msk) 357 #define SPIM_WAIT_FREE() \ 359 while (SPIM->CTL1 & SPIM_CTL1_SPIMEN_Msk) { } \ 366 #define SPIM_ENABLE_CACHE() (SPIM->CTL1 &= ~SPIM_CTL1_CACHEOFF_Msk) 372 #define SPIM_DISABLE_CACHE() (SPIM->CTL1 |= SPIM_CTL1_CACHEOFF_Msk) 378 #define SPIM_IS_CACHE_EN() ((SPIM->CTL1 & SPIM_CTL1_CACHEOFF_Msk) ? 0 : 1) 384 #define SPIM_ENABLE_CCM() (SPIM->CTL1 |= SPIM_CTL1_CCMEN_Msk) 390 #define SPIM_DISABLE_CCM() (SPIM->CTL1 &= ~SPIM_CTL1_CCMEN_Msk) 396 #define SPIM_IS_CCM_EN() ((SPIM->CTL1 & SPIM_CTL1_CCMEN_Msk) >> SPIM_CTL1_CCMEN_Pos) 402 #define SPIM_INVALID_CACHE() (SPIM->CTL1 |= SPIM_CTL1_CDINVAL_Msk) 408 #define SPIM_SET_SS_EN(x) \ 410 (SPIM->CTL1 = (SPIM->CTL1 & (~SPIM_CTL1_SS_Msk)) | ((! (x) ? 1UL : 0UL) << SPIM_CTL1_SS_Pos)); \ 417 #define SPIM_GET_SS_EN() \ 418 (!(SPIM->CTL1 & SPIM_CTL1_SS_Msk)) 424 #define SPIM_SET_SS_ACTLVL(x) \ 426 (SPIM->CTL1 = (SPIM->CTL1 & (~SPIM_CTL1_SSACTPOL_Msk)) | ((!! (x) ? 1UL : 0UL) << SPIM_CTL1_SSACTPOL_Pos)); \ 433 #define SPIM_SET_IDL_INTVL(x) \ 435 SPIM->CTL1 = (SPIM->CTL1 & (~SPIM_CTL1_IDLETIME_Msk)) | ((x) << SPIM_CTL1_IDLETIME_Pos); \ 442 #define SPIM_GET_IDL_INTVL() \ 443 ((SPIM->CTL1 & SPIM_CTL1_IDLETIME_Msk) >> SPIM_CTL1_IDLETIME_Pos) 449 #define SPIM_SET_CLOCK_DIVIDER(x) \ 451 SPIM->CTL1 = (SPIM->CTL1 & (~SPIM_CTL1_DIVIDER_Msk)) | ((x) << SPIM_CTL1_DIVIDER_Pos); \ 458 #define SPIM_GET_CLOCK_DIVIDER() \ 459 ((SPIM->CTL1 & SPIM_CTL1_DIVIDER_Msk) >> SPIM_CTL1_DIVIDER_Pos) 465 #define SPIM_SET_RXCLKDLY_DWDELSEL(x) \ 467 (SPIM->RXCLKDLY = (SPIM->RXCLKDLY & (~SPIM_RXCLKDLY_DWDELSEL_Msk)) | ((x) << SPIM_RXCLKDLY_DWDELSEL_Pos)); \ 474 #define SPIM_GET_RXCLKDLY_DWDELSEL() \ 475 ((SPIM->RXCLKDLY & SPIM_RXCLKDLY_DWDELSEL_Msk) >> SPIM_RXCLKDLY_DWDELSEL_Pos) 481 #define SPIM_SET_RXCLKDLY_RDDLYSEL(x) \ 483 (SPIM->RXCLKDLY = (SPIM->RXCLKDLY & (~SPIM_RXCLKDLY_RDDLYSEL_Msk)) | ((x) << SPIM_RXCLKDLY_RDDLYSEL_Pos)); \ 490 #define SPIM_GET_RXCLKDLY_RDDLYSEL() \ 491 ((SPIM->RXCLKDLY & SPIM_RXCLKDLY_RDDLYSEL_Msk) >> SPIM_RXCLKDLY_RDDLYSEL_Pos) 497 #define SPIM_SET_RXCLKDLY_RDEDGE() \ 498 (SPIM->RXCLKDLY |= SPIM_RXCLKDLY_RDEDGE_Msk); \ 504 #define SPIM_CLR_RXCLKDLY_RDEDGE() \ 505 (SPIM->RXCLKDLY &= ~SPIM_RXCLKDLY_RDEDGE_Msk) 511 #define SPIM_SET_DMMCTL_CRMDAT(x) \ 513 (SPIM->DMMCTL = (SPIM->DMMCTL & (~SPIM_DMMCTL_CRMDAT_Msk)) | ((x) << SPIM_DMMCTL_CRMDAT_Pos)) | SPIM_DMMCTL_CREN_Msk; \ 520 #define SPIM_GET_DMMCTL_CRMDAT() \ 521 ((SPIM->DMMCTL & SPIM_DMMCTL_CRMDAT_Msk) >> SPIM_DMMCTL_CRMDAT_Pos) 527 #define SPIM_DMM_SET_DESELTIM(x) \ 529 SPIM->DMMCTL = (SPIM->DMMCTL & ~SPIM_DMMCTL_DESELTIM_Msk) | (((x) & 0x1FUL) << SPIM_DMMCTL_DESELTIM_Pos); \ 536 #define SPIM_DMM_GET_DESELTIM() \ 537 ((SPIM->DMMCTL & SPIM_DMMCTL_DESELTIM_Msk) >> SPIM_DMMCTL_DESELTIM_Pos) 543 #define SPIM_DMM_ENABLE_BWEN() (SPIM->DMMCTL |= SPIM_DMMCTL_BWEN_Msk) 549 #define SPIM_DMM_DISABLE_BWEN() (SPIM->DMMCTL &= ~SPIM_DMMCTL_BWEN_Msk) 555 #define SPIM_DMM_ENABLE_CREN() (SPIM->DMMCTL |= SPIM_DMMCTL_CREN_Msk) 561 #define SPIM_DMM_DISABLE_CREN() (SPIM->DMMCTL &= ~SPIM_DMMCTL_CREN_Msk) 567 #define SPIM_DMM_SET_ACTSCLKT(x) \ 569 SPIM->DMMCTL = (SPIM->DMMCTL & ~SPIM_DMMCTL_ACTSCLKT_Msk) | (((x) & 0xFUL) << SPIM_DMMCTL_ACTSCLKT_Pos) | SPIM_DMMCTL_UACTSCLK_Msk; \ 576 #define SPIM_DMM_SET_DEFAULT_ACTSCLK() (SPIM->DMMCTL &= ~SPIM_DMMCTL_UACTSCLK_Msk) 582 #define SPIM_SET_DCNUM(x) \ 584 SPIM->CTL2 = (SPIM->CTL2 & ~SPIM_CTL2_DCNUM_Msk) | (((x) & 0x1FUL) << SPIM_CTL2_DCNUM_Pos) | SPIM_CTL2_USETEN_Msk; \ 591 #define SPIM_SET_DEFAULT_DCNUM(x) (SPIM->CTL2 &= ~SPIM_CTL2_USETEN_Msk) 607 void SPIM_EraseBlock(uint32_t u32Addr,
int is4ByteAddr, uint8_t u8ErsCmd, uint32_t u32NBit,
int isSync);
609 void SPIM_IO_Write(uint32_t u32Addr,
int is4ByteAddr, uint32_t u32NTx, uint8_t pu8TxBuf[], uint8_t wrCmd, uint32_t u32NBitCmd, uint32_t u32NBitAddr, uint32_t u32NBitDat);
610 void SPIM_IO_Read(uint32_t u32Addr,
int is4ByteAddr, uint32_t u32NRx, uint8_t pu8RxBuf[], uint8_t rdCmd, uint32_t u32NBitCmd, uint32_t u32NBitAddr, uint32_t u32NBitDat,
int u32NDummy);
612 void SPIM_DMA_Write(uint32_t u32Addr,
int is4ByteAddr, uint32_t u32NTx, uint8_t pu8TxBuf[], uint32_t wrCmd);
613 void SPIM_DMA_Read(uint32_t u32Addr,
int is4ByteAddr, uint32_t u32NRx, uint8_t pu8RxBuf[], uint32_t u32RdCmd,
int isSync);
void SPIM_EnterDirectMapMode(int is4ByteAddr, uint32_t u32RdCmd, uint32_t u32IdleIntvl)
Enter Direct Map mode.
void SPIM_IO_Write(uint32_t u32Addr, int is4ByteAddr, uint32_t u32NTx, uint8_t pu8TxBuf[], uint8_t wrCmd, uint32_t u32NBitCmd, uint32_t u32NBitAddr, uint32_t u32NBitDat)
Write data to SPI Flash by sending commands manually (I/O mode).
void SPIM_ExitDirectMapMode(void)
Exit Direct Map mode.
int SPIM_InitFlash(int clrWP)
Initialize SPIM flash.
int SPIM_Is4ByteModeEnable(uint32_t u32NBit)
int SPIM_Enable_4Bytes_Mode(int isEn, uint32_t u32NBit)
Enter/Exit 4-byte address mode.
void SPIM_DMA_Write(uint32_t u32Addr, int is4ByteAddr, uint32_t u32NTx, uint8_t pu8TxBuf[], uint32_t wrCmd)
Write data to SPI Flash by Page Write mode.
void SPIM_SetQuadEnable(int isEn, uint32_t u32NBit)
Set Quad Enable/disable.
void SPIM_ChipErase(uint32_t u32NBit, int isSync)
Erase whole chip.
void SPIM_DMA_Read(uint32_t u32Addr, int is4ByteAddr, uint32_t u32NRx, uint8_t pu8RxBuf[], uint32_t u32RdCmd, int isSync)
Read data from SPI Flash by Page Read mode.
void SPIM_IO_Read(uint32_t u32Addr, int is4ByteAddr, uint32_t u32NRx, uint8_t pu8RxBuf[], uint8_t rdCmd, uint32_t u32NBitCmd, uint32_t u32NBitAddr, uint32_t u32NBitDat, int u32NDummy)
Read data from SPI Flash by sending commands manually (I/O mode).
void SPIM_EraseBlock(uint32_t u32Addr, int is4ByteAddr, uint8_t u8ErsCmd, uint32_t u32NBit, int isSync)
Erase one block.
uint32_t SPIM_GetSClkFreq(void)
Get SPIM serial clock.
void SPIM_WinbondUnlock(uint32_t u32NBit)
void SPIM_ReadJedecId(uint8_t idBuf[], uint32_t u32NRx, uint32_t u32NBit)
Issue JEDEC ID command.