BLE5.2 1.0
开发文档说明
xc_drv_spi.c
浏览该文件的文档.
1
25/*-----------------------------------------------------------------------------------
26 INCLUDE HEADE FILES
27 ------------------------------------------------------------------------------------*/
28#include "xc6xxx.h"
29
30/*------------------------------------------------------------------------------------
31 Global Variables
32 -------------------------------------------------------------------------------------*/
33
34typedef struct
35{
36 bool SPI_DMA_IT_Enable_Flag[3];
37 uint8_t SPI_Mode[3];
39
41
42/*------------------------------------------------------------------------------------
43 Func Prototype
44 -------------------------------------------------------------------------------------*/
45eXC_RESULT xc_spi_write_bytes(uint8_t reg_idx, uint8_t *txdata, uint16_t len);
46eXC_RESULT xc_spi_read_bytes(uint8_t reg_idx, uint8_t *rxdata, uint16_t len);
47/*------------------------------------------------------------------------------------
48 Functions
49 -------------------------------------------------------------------------------------*/
50void xc_spi_init(uint8_t reg_idx, SPI_InitCfg_t *init_cfg)
51{
52#if (USE_XIP == 0)
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);
56
57 cpr_ctlapbclken_grctl__ssi0_pclk_en__setf(ENABLE);
58
59 cpr_ssi0_mclk_ctl__ssi_mclk_div__setf(0);
60 cpr_ssi0_mclk_ctl__ssi_mclk_en__setf(1);
61
62 cpr_ssi_ctrl__ssi0_protocol__setf(SSI_CTRL0_FRF_MOTOROLA);
63
64 }
65#endif
66 if (SPI1_IDX == reg_idx) {
67
68 cpr_rstctl_subrst_sw__ssi1_rstn__setf(RSTCTL_ENABLE);
69 cpr_rstctl_subrst_sw__ssi1_rstn__setf(RSTCTL_DISABLE);
70
71 cpr_ssi1_mclk_ctl__ssi_mclk_div__setf(0);
72 cpr_ssi1_mclk_ctl__ssi_mclk_en__setf(1);
73
74 cpr_ctlapbclken_grctl__ssi1_pclk_en__setf(ENABLE);
75
76 if (init_cfg->Mode == SPI_MODE_MASTER) {
77
78 cpr_ssi_ctrl__ssi1_master_en__setf(ENABLE);
79 } else if (init_cfg->Mode == SPI_MODE_SLAVE) {
80
81 cpr_ssi_ctrl__ssi1_master_en__setf(DISABLE);
82 }
83 cpr_ssi_ctrl__ssi1_protocol__setf(SSI_CTRL0_FRF_MOTOROLA);
84 } else if (SPI2_IDX == reg_idx) {
85
86 cpr_rstctl_subrst_sw__ssi2_rstn__setf(RSTCTL_ENABLE);
87 cpr_rstctl_subrst_sw__ssi2_rstn__setf(RSTCTL_DISABLE);
88
89 cpr_ssi1_mclk_ctl__ssi2_mclk_div__setf(0);
90 cpr_ssi1_mclk_ctl__ssi2_mclk_en__setf(1);
91
92 cpr_ctlapbclken_grctl__ssi2_pclk_en__setf(ENABLE);
93
94 cpr_ssi_ctrl__ssi2_protocol__setf(SSI_CTRL0_FRF_MOTOROLA);
95 }
96
97 spi_en_set(reg_idx, DISABLE);
98 // sste is automatically set to 1 when spi slave is initialized.
99 // therefor, manually clear this bit to 0 here.
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);
105
106 spi_ie_set(reg_idx, DISABLE);
107 spi_se_set(reg_idx, ENABLE);
108 spi_baud__ssi_sckdv__setf(reg_idx, init_cfg->BaudRatePrescaler);
109 spi_txftl__ssi_tft__setf(reg_idx, SSI_TXFTL_FIFO_1);
110 spi_rxftl__ssi_rft__setf(reg_idx, SSI_RXFTL_FIFO_1);
111}
112
113static void xc_spi_enable(uint8_t reg_idx, uint8_t dfs)
114{
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);
119}
120
121static void xc_spi_disable(uint8_t reg_idx) { spi_en__ssi_sen__setf(reg_idx, DISABLE); }
122
123void xc_spi_rxftl_fifo_set(uint8_t reg_idx, uint8_t val)
124{
125 spi_rxftl__ssi_rft__setf(reg_idx, val);
126}
127
128void xc_spi_txftl_fifo_set(uint8_t reg_idx, uint8_t val)
129{
130 spi_txftl__ssi_tft__setf(reg_idx, val);
131}
132
133void xc_spi_enable_it(uint8_t reg_idx, uint8_t val) { spi_ie_set(reg_idx, val); }
134
135void xc_spi_disable_it(uint8_t reg_idx, uint8_t val) { spi_ie_set(reg_idx, val); }
136
137void xc_spi_flash_power_down(uint8_t reg_idx)
138{
139 uint8_t txbuff[2] = {0};
140
141 txbuff[1] = CMD_PWRDWN;
142
143 xc_spi_enable(reg_idx, SSI_CTRL0_DFS_LEN_8BIT);
144 xc_spi_write_bytes(reg_idx, txbuff, sizeof(txbuff));
145 xc_spi_disable(reg_idx);
146}
147
148void xc_spi_flash_wake_up(uint8_t reg_idx)
149{
150 uint8_t txbuff[2] = {0};
151
152 txbuff[1] = CMD_RELEASE_PWRDWN;
153
154 xc_spi_enable(reg_idx, SSI_CTRL0_DFS_LEN_8BIT);
155 xc_spi_write_bytes(reg_idx, txbuff, sizeof(txbuff));
156 xc_spi_disable(reg_idx);
157}
158
159static uint8_t xc_spi_flash_wait_busy(uint8_t reg_idx)
160{
161 uint8_t cmd[2] = {0};
162 uint8_t sta[2] = {0xff, 0xff};
163
164 cmd[0] = CMD_READ_STATUS;
165 cmd[1] = 0xff;
166
167 xc_spi_enable(reg_idx, SSI_CTRL0_DFS_LEN_16BIT);
168 xc_spi_write_bytes(reg_idx, cmd, sizeof(cmd));
169
170 xc_spi_read_bytes(reg_idx, sta, sizeof(sta));
171 xc_spi_disable(reg_idx);
172
173 return (sta[1] & 0x01);
174}
175
176static void xc_spi_flash_write_enable(uint8_t reg_idx)
177{
178 uint8_t txbuff[2] = {0};
179
180 txbuff[1] = CMD_WRITE_ENABLE;
181
182 xc_spi_enable(reg_idx, SSI_CTRL0_DFS_LEN_8BIT);
183 xc_spi_write_bytes(reg_idx, txbuff, sizeof(txbuff));
184 xc_spi_disable(reg_idx);
185}
186
187eXC_RESULT xc_spi_flash_erase_sector(uint8_t reg_idx, uint32_t Dst_Addr)
188{
189 uint8_t cmd[4];
190
191 while (xc_spi_flash_wait_busy(reg_idx))
192 ;
194 while (xc_spi_flash_wait_busy(reg_idx))
195 ;
196
197 cmd[0] = CMD_SECTOR_ERASE;
198 cmd[1] = Dst_Addr >> 16;
199 cmd[2] = Dst_Addr >> 8;
200 cmd[3] = Dst_Addr;
201
202 xc_spi_enable(reg_idx, SSI_CTRL0_DFS_LEN_16BIT);
203 xc_spi_write_bytes(reg_idx, cmd, sizeof(cmd));
204 xc_spi_disable(reg_idx);
205
206 while (xc_spi_flash_wait_busy(reg_idx))
207 ;
208
209 return XR_OK;
210}
211#if (USE_INTEGRATED_FlASH == USE_PUYA_FlASH)
212void xc_spi_flash_erase_page(uint8_t reg_idx, uint32_t Dst_Addr)
213{
214 uint8_t cmd[4];
215
216 while (xc_spi_flash_wait_busy(reg_idx))
217 ;
219 while (xc_spi_flash_wait_busy(reg_idx))
220 ;
221
222 cmd[0] = CMD_PAGE_ERASE;
223 cmd[1] = Dst_Addr >> 16;
224 cmd[2] = Dst_Addr >> 8;
225 cmd[3] = Dst_Addr;
226
227 xc_spi_enable(reg_idx, SSI_CTRL0_DFS_LEN_16BIT);
228 xc_spi_write_bytes(reg_idx, cmd, sizeof(cmd));
229 xc_spi_disable(reg_idx);
230
231 while (xc_spi_flash_wait_busy(reg_idx))
232 ;
233}
234#endif
235void xc_spi_flash_write_page(uint8_t reg_idx, uint32_t WriteAddr, uint8_t *pBuffer)
236{
237 uint32_t addr = WriteAddr;
238 uint8_t cmd[16 + 4] = {0};
239
240 for (uint8_t i = 0; i < 16; i++) {
241 while (xc_spi_flash_wait_busy(reg_idx))
242 ;
244 while (xc_spi_flash_wait_busy(reg_idx))
245 ;
246
247 cmd[0] = CMD_PAGE_PROGRAM;
248 cmd[1] = addr >> 16;
249 cmd[2] = addr >> 8;
250 cmd[3] = addr;
251
252 memcpy(&cmd[4], pBuffer + i * 16, 16);
253
254 xc_spi_enable(reg_idx, SSI_CTRL0_DFS_LEN_16BIT);
255 xc_spi_write_bytes(reg_idx, cmd, sizeof(cmd));
256
257 addr += 16;
258 }
259
260 while (xc_spi_flash_wait_busy(reg_idx))
261 ;
262 xc_spi_disable(reg_idx);
263}
264
265void xc_spi_flash_read_page(uint8_t reg_idx, uint32_t ReadAddr, uint8_t *pBuffer)
266{
267 uint8_t cmd[16 + 4] = {0};
268 uint8_t mid[16 + 4] = {0};
269 uint16_t rx_idx = 0;
270 uint32_t addr = ReadAddr;
271
272 for (uint8_t i = 0; i < 16; i++) {
273 cmd[0] = CMD_READ_DATA;
274 cmd[1] = addr >> 16;
275 cmd[2] = addr >> 8;
276 cmd[3] = addr;
277
278 xc_spi_enable(reg_idx, SSI_CTRL0_DFS_LEN_16BIT);
279 xc_spi_write_bytes(reg_idx, cmd, sizeof(cmd));
280 xc_spi_read_bytes(reg_idx, mid, sizeof(cmd));
281
282 memcpy(&pBuffer[rx_idx], mid + 4, 16);
283 addr += 16;
284 rx_idx += 16;
285 }
286
287 xc_spi_disable(reg_idx);
288}
289
301eXC_RESULT xc_spi_flash_write(uint8_t reg_idx, uint32_t writeAddr, uint8_t *buff,
302 uint16_t size)
303{
304 uint32_t cur_addr = writeAddr;
305 uint32_t end_addr = writeAddr + size;
306 uint16_t wt_len = 0;
307 // The current page number occupied by this data storage
308 uint16_t CurSectorNum = 0;
309 uint16_t CurPageNum = 0;
310 // The position occupied by this address on the current page
311 uint32_t CurStartPsr = 0;
312
313 uint32_t mid = 0;
314 xc_spi_flash_rdid(reg_idx ,(uint8_t*)&mid);
315
316 if(mid != GD_FlASH_RDID){
317 uint8_t temp_buff[FLASH_PAGE_SIZE];
318 while (cur_addr != end_addr) {
319 /* code */
320 CurPageNum = CUR_PAGE_NUM(cur_addr);
321 CurStartPsr = CUR_START_PSR(cur_addr);
322
323 xc_spi_flash_read_page(reg_idx, CurPageNum * FLASH_PAGE_SIZE, temp_buff);
324
325 xc_spi_flash_erase_page(reg_idx, CurPageNum * FLASH_PAGE_SIZE);
326
327 if (CurStartPsr) {
328 memcpy(&temp_buff[CurStartPsr], buff + wt_len,
329 (FLASH_PAGE_SIZE - CurStartPsr) > size - wt_len // ǰʣĿռǷд
330 ? size - wt_len
331 : (FLASH_PAGE_SIZE - CurStartPsr));
332 wt_len += wt_len + ((FLASH_PAGE_SIZE - CurStartPsr) > size - wt_len
333 ? size - wt_len
334 : (FLASH_PAGE_SIZE - CurStartPsr));
335 cur_addr += wt_len;
336 } else {
337 memcpy(temp_buff, buff + wt_len,
338 size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
339 : size - wt_len);
340 cur_addr += (size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
341 : size - wt_len);
342 wt_len += (size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
343 : size - wt_len);
344 }
345
346 xc_spi_flash_write_page(reg_idx, CurPageNum * FLASH_PAGE_SIZE, temp_buff);
347 }
348
349 }else if(mid == GD_FlASH_RDID){
350 uint8_t temp_buff[FLASH_SECTOR_SIZE];
351 while (cur_addr != end_addr) {
352 /* code */
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);
357 }
358
359 xc_spi_flash_erase_sector(reg_idx ,CurSectorNum * FLASH_SECTOR_SIZE);
360
361 if (CurStartPsr) {
362 memcpy(&temp_buff[CurStartPsr], buff + wt_len,
363 (FLASH_SECTOR_SIZE - CurStartPsr) > size - wt_len // ǰʣĿռǷд
364 ? size - wt_len
365 : (FLASH_SECTOR_SIZE - CurStartPsr));
366 wt_len += wt_len + ((FLASH_SECTOR_SIZE - CurStartPsr) > size - wt_len
367 ? size - wt_len
368 : (FLASH_SECTOR_SIZE - CurStartPsr));
369 cur_addr += wt_len;
370 } else {
371 memcpy(temp_buff, buff + wt_len,
372 size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
373 : size - wt_len);
374 cur_addr += (size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
375 : size - wt_len);
376 wt_len += (size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
377 : size - wt_len);
378 }
379
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);
382 }
383 }
384 }
385
386 return XR_OK;
387}
388
400eXC_RESULT xc_spi_flash_read(uint8_t reg_idx, uint32_t readAddr, uint8_t *buff,
401 uint16_t len)
402{
403 eXC_RESULT ret = XR_OK;
404 // The page number to be occupied by the data written this time
405 uint16_t ReqPageCnt = 0;
406 // The current page number occupied by this data storage
407 uint16_t CurPageNum = 0;
408 // The position occupied by this address on the current page
409 uint16_t CurStartPsr = 0;
410 // The next page number that may be occupied by this data storage
411 uint16_t NextPageNum = 0;
412 // The end address of the next page that may be occupied by this data
413 // storage
414 uint16_t NextStopPsr = 0;
415 uint8_t temp_buff[FLASH_PAGE_SIZE] = {0};
416
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)
421 ReqPageCnt = 2;
422 else
423 ReqPageCnt = 1;
424
425 if (ReqPageCnt == 1) // Note that only one page is read here
426 {
427 xc_spi_flash_read_page(reg_idx, CurPageNum * FLASH_PAGE_SIZE,
428 temp_buff);
429 memcpy(buff, &temp_buff[CurStartPsr], len);
430 } else if (ReqPageCnt == 2) {
431 NextPageNum = CurPageNum + 1;
432 NextStopPsr = len + CurStartPsr - FLASH_PAGE_SIZE;
433 // First page read
434 xc_spi_flash_read_page(reg_idx, CurPageNum * FLASH_PAGE_SIZE,
435 temp_buff);
436 memcpy(buff, &temp_buff[CurStartPsr], len - NextStopPsr);
437 // second page read
438 uint16_t HaveCopyNum = len - NextStopPsr;
439 xc_spi_flash_read_page(reg_idx, NextPageNum * FLASH_PAGE_SIZE,
440 temp_buff);
441 memcpy(buff + HaveCopyNum, temp_buff, NextStopPsr);
442 }
443 } else {
444 CurPageNum = CUR_PAGE_NUM(readAddr);
445 CurStartPsr = CUR_START_PSR(readAddr);
446 NextPageNum = CurPageNum + 1;
447
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;
451 xc_spi_flash_read_page(reg_idx, pre_addr, temp_buff);
452 memcpy(buff, &temp_buff[CurStartPsr], pre_len);
453 buff_idx += pre_len;
454
455 pre_addr = NextPageNum * FLASH_PAGE_SIZE;
456 while (buff_idx < len) {
457 if ((len - buff_idx) >= FLASH_PAGE_SIZE) {
458 xc_spi_flash_read_page(reg_idx, pre_addr, temp_buff);
459 memcpy(&buff[buff_idx], temp_buff, FLASH_PAGE_SIZE);
460 buff_idx += FLASH_PAGE_SIZE;
461 pre_addr += FLASH_PAGE_SIZE;
462 } else {
463 xc_spi_flash_read_page(reg_idx, pre_addr, temp_buff);
464 memcpy(&buff[buff_idx], temp_buff, len - buff_idx);
465 buff_idx += (len - buff_idx);
466 pre_addr += (len - buff_idx);
467 }
468 }
469 }
470
471 return ret;
472}
473
474void xc_spi_flash_read_128bit_uid(uint8_t reg_idx, uint8_t *buff)
475{
476 while (xc_spi_flash_wait_busy(reg_idx)) {
477 DEBUG("line=%d,status=%d\n", __LINE__, xc_spi_flash_wait_busy(reg_idx));
478 };
479
480 uint8_t cmd[21] = {0};
481 uint8_t id[21] = {0};
482
483 cmd[0] = CMD_RUID;
484 cmd[1] = 0x00;
485 cmd[2] = 0x00;
486 cmd[3] = 0x00;
487 cmd[4] = 0x00;
488
489 xc_spi_enable(reg_idx, SSI_CTRL0_DFS_LEN_16BIT);
490 xc_spi_write_bytes(reg_idx, cmd, sizeof(cmd));
491
492 xc_spi_read_bytes(reg_idx, id, sizeof(id));
493 xc_spi_disable(reg_idx);
494
495 memcpy(buff, &id[5], 16);
496}
497
498eXC_RESULT xc_spi_flash_rdid(uint8_t reg_idx, uint8_t *buff)
499{
500 while (xc_spi_flash_wait_busy(reg_idx)) {
501 DEBUG("line=%d,status=%d\n", __LINE__, xc_spi_flash_wait_busy(reg_idx));
502 };
503
504 uint8_t cmd[4] = {0};
505 uint8_t id[4] = {0};
506
507 cmd[0] = CMD_RDID;
508 cmd[1] = 0xff;
509 cmd[2] = 0xff;
510 cmd[3] = 0xff;
511
512 xc_spi_enable(reg_idx, SSI_CTRL0_DFS_LEN_16BIT);
513 xc_spi_write_bytes(reg_idx, cmd, sizeof(cmd));
514
515 xc_spi_read_bytes(reg_idx, id, sizeof(id));
516 xc_spi_disable(reg_idx);
517
518 memcpy(buff, &id[1], 3);
519
520 return XR_OK;
521}
522
523/*---------------------------------- SPI1 Master & Slave API
524 * ---------------------------------------*/
525
534static void xc_spi_datasize_set(uint8_t reg_idx, uint8_t dfs)
535{
536
537 spi_en_set(reg_idx, DISABLE);
538 spi_ctrl0__ssi_dfs__setf(reg_idx, dfs);
539 spi_en_set(reg_idx, ENABLE);
540}
541
550eXC_RESULT xc_spi_write_bytes(uint8_t reg_idx, uint8_t *txdata, uint16_t len)
551{
552 if (len == 0)
553 return XR_ERROR;
554 uint16_t n;
555 uint8_t remain = len % 2;
556 uint16_t cnt = len / 2;
557 uint16_t mid_data[128 + 1] = {0};
558 uint16_t i = 0;
559
560 while (spi_sts__ssi_tfe__getf(reg_idx) == RESET) {
561 i++;
562 if (i >= SPI_WAIT_TIMEOUT) {
563 DEBUG("func=%s,line=%d,timeout\n", __func__, __LINE__);
564 return XR_TIMEOUT;
565 }
566 }
567
568 if (cnt != 0) {
569 for (n = 0; n < cnt; n++) {
570 mid_data[n] = ((txdata[n * 2] << 8) | txdata[n * 2 + 1]);
571 }
572 }
573
574 if (remain != 0) {
575 for (n = 0; n < remain; n++) {
576 mid_data[cnt] |= (txdata[cnt * 2 + n] << (16 - 8 * n));
577 }
578 }
579
580 if (cnt != 0) {
581 if (remain != 0)
582 cnt = cnt + 1;
583 for (n = 0; n < cnt; n++)
584 spi_data_set(reg_idx, mid_data[n]);
585 } else {
586 spi_data_set(reg_idx, mid_data[0]);
587 }
588
589 while ((spi_sts__ssi_rfne__getf(reg_idx) == RESET) ||
590 (spi_sts__ssi_tfe__getf(reg_idx) == RESET)) {
591 i++;
592 if (i >= SPI_WAIT_TIMEOUT) {
593 // DEBUG("func=%s,line=%d,timeout\n", __func__, __LINE__);
594 return XR_TIMEOUT;
595 }
596 }
597
598 return XR_OK;
599}
600
609eXC_RESULT xc_spi_read_bytes(uint8_t reg_idx, uint8_t *rxdata, uint16_t len)
610{
611 if (len == 0)
612 return XR_ERROR;
613
614 uint16_t n;
615 uint8_t remain = len % 2;
616 uint16_t cnt = len / 2;
617 uint16_t mid_data = 0;
618
619 if (cnt != 0) {
620 for (n = 0; n < cnt; n++) {
621
622 mid_data = spi_data_get(reg_idx);
623 rxdata[n * 2] = mid_data >> 8;
624 rxdata[n * 2 + 1] = mid_data;
625 }
626 }
627
628 if (remain != 0) {
629
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;
634 }
635 }
636
637 return XR_OK;
638}
639
648void xc_spi_write_and_read_data(uint8_t reg_idx, uint8_t *w_data, uint16_t w_size,
649 uint8_t *r_data, uint16_t r_size)
650{
651 if (w_size != (spi_rxftl_get(reg_idx) + 1) * 2)
652 return;
653 xc_spi_datasize_set(reg_idx, SSI_CTRL0_DFS_LEN_16BIT);
654 xc_spi_write_bytes(reg_idx, w_data, w_size);
655
656 while (!(spi_is_get(reg_idx) == SSI_IS_RXFIS_SET))
657 ;
658 xc_spi_read_bytes(reg_idx, r_data, r_size);
659 xc_spi_disable(reg_idx);
660}
uint32_t BaudRatePrescaler
Definition xc_drv_spi.h:137
uint32_t CLKPolarity
Definition xc_drv_spi.h:134
uint32_t DataSize
Definition xc_drv_spi.h:133
uint16_t Mode
Definition xc_drv_spi.h:131
uint32_t Direction
Definition xc_drv_spi.h:132
uint32_t CLKPhase
Definition xc_drv_spi.h:135
static volatile uint32_t mid
static void xc_spi_flash_write_enable(uint8_t reg_idx)
Definition xc_drv_spi.c:176
eXC_RESULT xc_spi_write_bytes(uint8_t reg_idx, uint8_t *txdata, uint16_t len)
Only applicable Master & Slave communication
Definition xc_drv_spi.c:550
void xc_spi_rxftl_fifo_set(uint8_t reg_idx, uint8_t val)
Definition xc_drv_spi.c:123
void xc_spi_disable_it(uint8_t reg_idx, uint8_t val)
Definition xc_drv_spi.c:135
void xc_spi_flash_power_down(uint8_t reg_idx)
Definition xc_drv_spi.c:137
static void xc_spi_disable(uint8_t reg_idx)
Definition xc_drv_spi.c:121
void xc_spi_flash_read_128bit_uid(uint8_t reg_idx, uint8_t *buff)
Definition xc_drv_spi.c:474
void xc_spi_enable_it(uint8_t reg_idx, uint8_t val)
Definition xc_drv_spi.c:133
void xc_spi_init(uint8_t reg_idx, SPI_InitCfg_t *init_cfg)
Definition xc_drv_spi.c:50
eXC_RESULT xc_spi_flash_write(uint8_t reg_idx, uint32_t writeAddr, uint8_t *buff, uint16_t size)
Definition xc_drv_spi.c:301
SPI_CtrlBlock_Typedef m_spi_cb
Definition xc_drv_spi.c:40
void xc_spi_flash_wake_up(uint8_t reg_idx)
Definition xc_drv_spi.c:148
static uint8_t xc_spi_flash_wait_busy(uint8_t reg_idx)
Definition xc_drv_spi.c:159
eXC_RESULT xc_spi_flash_rdid(uint8_t reg_idx, uint8_t *buff)
Definition xc_drv_spi.c:498
eXC_RESULT xc_spi_read_bytes(uint8_t reg_idx, uint8_t *rxdata, uint16_t len)
Only applicable Master & Slave communication
Definition xc_drv_spi.c:609
static void xc_spi_datasize_set(uint8_t reg_idx, uint8_t dfs)
Only Master & Slave
Definition xc_drv_spi.c:534
void xc_spi_txftl_fifo_set(uint8_t reg_idx, uint8_t val)
Definition xc_drv_spi.c:128
static void xc_spi_enable(uint8_t reg_idx, uint8_t dfs)
Definition xc_drv_spi.c:113
eXC_RESULT xc_spi_flash_erase_sector(uint8_t reg_idx, uint32_t Dst_Addr)
Definition xc_drv_spi.c:187
eXC_RESULT xc_spi_flash_read(uint8_t reg_idx, uint32_t readAddr, uint8_t *buff, uint16_t len)
Definition xc_drv_spi.c:400
void xc_spi_flash_erase_page(uint8_t reg_idx, uint32_t Dst_Addr)
Definition xc_drv_spi.c:212
void xc_spi_flash_write_page(uint8_t reg_idx, uint32_t WriteAddr, uint8_t *pBuffer)
Definition xc_drv_spi.c:235
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
Definition xc_drv_spi.c:648
void xc_spi_flash_read_page(uint8_t reg_idx, uint32_t ReadAddr, uint8_t *pBuffer)
Definition xc_drv_spi.c:265