36 bool SPI_DMA_IT_Enable_Flag[3];
53 if (SPI0_IDX == reg_idx) {
54 cpr_rstctl_subrst_sw__ssi0_rstn__setf(RSTCTL_ENABLE);
55 cpr_rstctl_subrst_sw__ssi0_rstn__setf(RSTCTL_DISABLE);
57 cpr_ctlapbclken_grctl__ssi0_pclk_en__setf(ENABLE);
59 cpr_ssi0_mclk_ctl__ssi_mclk_div__setf(0);
60 cpr_ssi0_mclk_ctl__ssi_mclk_en__setf(1);
62 cpr_ssi_ctrl__ssi0_protocol__setf(SSI_CTRL0_FRF_MOTOROLA);
66 if (SPI1_IDX == reg_idx) {
68 cpr_rstctl_subrst_sw__ssi1_rstn__setf(RSTCTL_ENABLE);
69 cpr_rstctl_subrst_sw__ssi1_rstn__setf(RSTCTL_DISABLE);
71 cpr_ssi1_mclk_ctl__ssi_mclk_div__setf(0);
72 cpr_ssi1_mclk_ctl__ssi_mclk_en__setf(1);
74 cpr_ctlapbclken_grctl__ssi1_pclk_en__setf(ENABLE);
76 if (init_cfg->
Mode == SPI_MODE_MASTER) {
78 cpr_ssi_ctrl__ssi1_master_en__setf(ENABLE);
79 }
else if (init_cfg->
Mode == SPI_MODE_SLAVE) {
81 cpr_ssi_ctrl__ssi1_master_en__setf(DISABLE);
83 cpr_ssi_ctrl__ssi1_protocol__setf(SSI_CTRL0_FRF_MOTOROLA);
84 }
else if (SPI2_IDX == reg_idx) {
86 cpr_rstctl_subrst_sw__ssi2_rstn__setf(RSTCTL_ENABLE);
87 cpr_rstctl_subrst_sw__ssi2_rstn__setf(RSTCTL_DISABLE);
89 cpr_ssi1_mclk_ctl__ssi2_mclk_div__setf(0);
90 cpr_ssi1_mclk_ctl__ssi2_mclk_en__setf(1);
92 cpr_ctlapbclken_grctl__ssi2_pclk_en__setf(ENABLE);
94 cpr_ssi_ctrl__ssi2_protocol__setf(SSI_CTRL0_FRF_MOTOROLA);
97 spi_en_set(reg_idx, DISABLE);
100 spi_ctrl0__ssi_sste__setf(reg_idx, DISABLE);
101 spi_ctrl0__ssi_tmod__setf(reg_idx, init_cfg->
Direction);
102 spi_ctrl0__ssi_scpol__setf(reg_idx, init_cfg->
CLKPolarity);
103 spi_ctrl0__ssi_scpha__setf(reg_idx, init_cfg->
CLKPhase);
104 spi_ctrl0__ssi_dfs__setf(reg_idx, init_cfg->
DataSize);
106 spi_ie_set(reg_idx, DISABLE);
107 spi_se_set(reg_idx, ENABLE);
109 spi_txftl__ssi_tft__setf(reg_idx, SSI_TXFTL_FIFO_1);
110 spi_rxftl__ssi_rft__setf(reg_idx, SSI_RXFTL_FIFO_1);
115 spi_en__ssi_sen__setf(reg_idx, DISABLE);
116 spi_dmas_set(reg_idx, DISABLE);
117 spi_ctrl0__ssi_dfs__setf(reg_idx, dfs);
118 spi_en__ssi_sen__setf(reg_idx, ENABLE);
121static void xc_spi_disable(uint8_t reg_idx) { spi_en__ssi_sen__setf(reg_idx, DISABLE); }
125 spi_rxftl__ssi_rft__setf(reg_idx, val);
130 spi_txftl__ssi_tft__setf(reg_idx, val);
139 uint8_t txbuff[2] = {0};
141 txbuff[1] = CMD_PWRDWN;
150 uint8_t txbuff[2] = {0};
152 txbuff[1] = CMD_RELEASE_PWRDWN;
161 uint8_t cmd[2] = {0};
162 uint8_t sta[2] = {0xff, 0xff};
164 cmd[0] = CMD_READ_STATUS;
173 return (sta[1] & 0x01);
178 uint8_t txbuff[2] = {0};
180 txbuff[1] = CMD_WRITE_ENABLE;
197 cmd[0] = CMD_SECTOR_ERASE;
198 cmd[1] = Dst_Addr >> 16;
199 cmd[2] = Dst_Addr >> 8;
211#if (USE_INTEGRATED_FlASH == USE_PUYA_FlASH)
222 cmd[0] = CMD_PAGE_ERASE;
223 cmd[1] = Dst_Addr >> 16;
224 cmd[2] = Dst_Addr >> 8;
237 uint32_t addr = WriteAddr;
238 uint8_t cmd[16 + 4] = {0};
240 for (uint8_t i = 0; i < 16; i++) {
247 cmd[0] = CMD_PAGE_PROGRAM;
252 memcpy(&cmd[4], pBuffer + i * 16, 16);
267 uint8_t cmd[16 + 4] = {0};
268 uint8_t
mid[16 + 4] = {0};
270 uint32_t addr = ReadAddr;
272 for (uint8_t i = 0; i < 16; i++) {
273 cmd[0] = CMD_READ_DATA;
282 memcpy(&pBuffer[rx_idx],
mid + 4, 16);
304 uint32_t cur_addr = writeAddr;
305 uint32_t end_addr = writeAddr + size;
308 uint16_t CurSectorNum = 0;
309 uint16_t CurPageNum = 0;
311 uint32_t CurStartPsr = 0;
316 if(
mid != GD_FlASH_RDID){
317 uint8_t temp_buff[FLASH_PAGE_SIZE];
318 while (cur_addr != end_addr) {
320 CurPageNum = CUR_PAGE_NUM(cur_addr);
321 CurStartPsr = CUR_START_PSR(cur_addr);
328 memcpy(&temp_buff[CurStartPsr], buff + wt_len,
329 (FLASH_PAGE_SIZE - CurStartPsr) > size - wt_len
331 : (FLASH_PAGE_SIZE - CurStartPsr));
332 wt_len += wt_len + ((FLASH_PAGE_SIZE - CurStartPsr) > size - wt_len
334 : (FLASH_PAGE_SIZE - CurStartPsr));
337 memcpy(temp_buff, buff + wt_len,
338 size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
340 cur_addr += (size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
342 wt_len += (size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
349 }
else if(
mid == GD_FlASH_RDID){
350 uint8_t temp_buff[FLASH_SECTOR_SIZE];
351 while (cur_addr != end_addr) {
353 CurSectorNum = CUR_SECTOR_NUM(cur_addr);
354 CurStartPsr = CUR_START_PSR(cur_addr);
355 for(
int i=0;i<FLASH_SECTOR_SIZE/FLASH_PAGE_SIZE;i++){
356 xc_spi_flash_read_page(reg_idx, CurSectorNum * FLASH_SECTOR_SIZE + i* FLASH_PAGE_SIZE, temp_buff+i*FLASH_PAGE_SIZE);
362 memcpy(&temp_buff[CurStartPsr], buff + wt_len,
363 (FLASH_SECTOR_SIZE - CurStartPsr) > size - wt_len
365 : (FLASH_SECTOR_SIZE - CurStartPsr));
366 wt_len += wt_len + ((FLASH_SECTOR_SIZE - CurStartPsr) > size - wt_len
368 : (FLASH_SECTOR_SIZE - CurStartPsr));
371 memcpy(temp_buff, buff + wt_len,
372 size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
374 cur_addr += (size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
376 wt_len += (size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
380 for(
int i=0;i<FLASH_SECTOR_SIZE/FLASH_PAGE_SIZE;i++){
381 xc_spi_flash_write_page(reg_idx, CurSectorNum * FLASH_SECTOR_SIZE + i* FLASH_PAGE_SIZE, temp_buff+i*FLASH_PAGE_SIZE);
403 eXC_RESULT ret = XR_OK;
405 uint16_t ReqPageCnt = 0;
407 uint16_t CurPageNum = 0;
409 uint16_t CurStartPsr = 0;
411 uint16_t NextPageNum = 0;
414 uint16_t NextStopPsr = 0;
415 uint8_t temp_buff[FLASH_PAGE_SIZE] = {0};
417 if (len <= FLASH_PAGE_SIZE) {
418 CurPageNum = CUR_PAGE_NUM(readAddr);
419 CurStartPsr = CUR_START_PSR(readAddr);
420 if ((len + CurStartPsr) > FLASH_PAGE_SIZE)
429 memcpy(buff, &temp_buff[CurStartPsr], len);
430 }
else if (ReqPageCnt == 2) {
431 NextPageNum = CurPageNum + 1;
432 NextStopPsr = len + CurStartPsr - FLASH_PAGE_SIZE;
436 memcpy(buff, &temp_buff[CurStartPsr], len - NextStopPsr);
438 uint16_t HaveCopyNum = len - NextStopPsr;
441 memcpy(buff + HaveCopyNum, temp_buff, NextStopPsr);
444 CurPageNum = CUR_PAGE_NUM(readAddr);
445 CurStartPsr = CUR_START_PSR(readAddr);
446 NextPageNum = CurPageNum + 1;
448 uint16_t buff_idx = 0;
449 uint16_t pre_len = NextPageNum * FLASH_PAGE_SIZE - readAddr;
450 uint32_t pre_addr = CurPageNum * FLASH_PAGE_SIZE;
452 memcpy(buff, &temp_buff[CurStartPsr], pre_len);
455 pre_addr = NextPageNum * FLASH_PAGE_SIZE;
456 while (buff_idx < len) {
457 if ((len - buff_idx) >= FLASH_PAGE_SIZE) {
459 memcpy(&buff[buff_idx], temp_buff, FLASH_PAGE_SIZE);
460 buff_idx += FLASH_PAGE_SIZE;
461 pre_addr += FLASH_PAGE_SIZE;
464 memcpy(&buff[buff_idx], temp_buff, len - buff_idx);
465 buff_idx += (len - buff_idx);
466 pre_addr += (len - buff_idx);
480 uint8_t cmd[21] = {0};
481 uint8_t
id[21] = {0};
495 memcpy(buff, &
id[5], 16);
504 uint8_t cmd[4] = {0};
518 memcpy(buff, &
id[1], 3);
537 spi_en_set(reg_idx, DISABLE);
538 spi_ctrl0__ssi_dfs__setf(reg_idx, dfs);
539 spi_en_set(reg_idx, ENABLE);
555 uint8_t remain = len % 2;
556 uint16_t cnt = len / 2;
557 uint16_t mid_data[128 + 1] = {0};
560 while (spi_sts__ssi_tfe__getf(reg_idx) == RESET) {
562 if (i >= SPI_WAIT_TIMEOUT) {
563 DEBUG(
"func=%s,line=%d,timeout\n", __func__, __LINE__);
569 for (n = 0; n < cnt; n++) {
570 mid_data[n] = ((txdata[n * 2] << 8) | txdata[n * 2 + 1]);
575 for (n = 0; n < remain; n++) {
576 mid_data[cnt] |= (txdata[cnt * 2 + n] << (16 - 8 * n));
583 for (n = 0; n < cnt; n++)
584 spi_data_set(reg_idx, mid_data[n]);
586 spi_data_set(reg_idx, mid_data[0]);
589 while ((spi_sts__ssi_rfne__getf(reg_idx) == RESET) ||
590 (spi_sts__ssi_tfe__getf(reg_idx) == RESET)) {
592 if (i >= SPI_WAIT_TIMEOUT) {
615 uint8_t remain = len % 2;
616 uint16_t cnt = len / 2;
617 uint16_t mid_data = 0;
620 for (n = 0; n < cnt; n++) {
622 mid_data = spi_data_get(reg_idx);
623 rxdata[n * 2] = mid_data >> 8;
624 rxdata[n * 2 + 1] = mid_data;
630 mid_data = spi_data_get(reg_idx);
631 for (n = 0; n < remain; n++) {
632 rxdata[cnt * 2 + n] = mid_data >> 8;
633 rxdata[cnt * 2 + 1 + n] = mid_data;
649 uint8_t *r_data, uint16_t r_size)
651 if (w_size != (spi_rxftl_get(reg_idx) + 1) * 2)
656 while (!(spi_is_get(reg_idx) == SSI_IS_RXFIS_SET))
uint32_t BaudRatePrescaler
static volatile uint32_t mid
static void xc_spi_flash_write_enable(uint8_t reg_idx)
eXC_RESULT xc_spi_write_bytes(uint8_t reg_idx, uint8_t *txdata, uint16_t len)
Only applicable Master & Slave communication
void xc_spi_rxftl_fifo_set(uint8_t reg_idx, uint8_t val)
void xc_spi_disable_it(uint8_t reg_idx, uint8_t val)
void xc_spi_flash_power_down(uint8_t reg_idx)
static void xc_spi_disable(uint8_t reg_idx)
void xc_spi_flash_read_128bit_uid(uint8_t reg_idx, uint8_t *buff)
void xc_spi_enable_it(uint8_t reg_idx, uint8_t val)
void xc_spi_init(uint8_t reg_idx, SPI_InitCfg_t *init_cfg)
eXC_RESULT xc_spi_flash_write(uint8_t reg_idx, uint32_t writeAddr, uint8_t *buff, uint16_t size)
SPI_CtrlBlock_Typedef m_spi_cb
void xc_spi_flash_wake_up(uint8_t reg_idx)
static uint8_t xc_spi_flash_wait_busy(uint8_t reg_idx)
eXC_RESULT xc_spi_flash_rdid(uint8_t reg_idx, uint8_t *buff)
eXC_RESULT xc_spi_read_bytes(uint8_t reg_idx, uint8_t *rxdata, uint16_t len)
Only applicable Master & Slave communication
static void xc_spi_datasize_set(uint8_t reg_idx, uint8_t dfs)
Only Master & Slave
void xc_spi_txftl_fifo_set(uint8_t reg_idx, uint8_t val)
static void xc_spi_enable(uint8_t reg_idx, uint8_t dfs)
eXC_RESULT xc_spi_flash_erase_sector(uint8_t reg_idx, uint32_t Dst_Addr)
eXC_RESULT xc_spi_flash_read(uint8_t reg_idx, uint32_t readAddr, uint8_t *buff, uint16_t len)
void xc_spi_flash_erase_page(uint8_t reg_idx, uint32_t Dst_Addr)
void xc_spi_flash_write_page(uint8_t reg_idx, uint32_t WriteAddr, uint8_t *pBuffer)
void xc_spi_write_and_read_data(uint8_t reg_idx, uint8_t *w_data, uint16_t w_size, uint8_t *r_data, uint16_t r_size)
Only applicable Master & Slave communication
void xc_spi_flash_read_page(uint8_t reg_idx, uint32_t ReadAddr, uint8_t *pBuffer)