123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- /*
- * Copyright 2016, yichip Semiconductor(shenzhen office)
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Yichip Semiconductor;
- * the contents of this file may not be disclosed to third parties, copied
- * or duplicated in any form, in whole or in part, without the prior
- * written permission of Yichip Semiconductor.
- */
- #include "yc11xx_spi.h"
- #include <stdlib.h>
- #include <string.h>
- //#define YC1121B
- typedef struct
- {
- uint8_t Ctrl;
- uint8_t Dealy;
- uint16_t TxLen;
- uint16_t TxAddr;
- uint16_t RxAddr;
- uint16_t RxLen;
- } __packed Spix_RegDef;
- void SPI_Init(SPI_InitTypeDef* SPI_InitStruct)
- {
- #define SPI_AUTO_INCR_ADDR ((uint8_t)1<<6)
- register uint16_t SpixCtrl = 0;
- Spix_RegDef * SpiAdr = NULL;
- void *Ptr = NULL;
- /*check parameter*/
- _ASSERT(SPI_InitStruct != NULL);
- _ASSERT(IS_SPI_MODE(SPI_InitStruct->SPI_Mode));
- _ASSERT(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL));
- _ASSERT(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA));
- _ASSERT(IS_SPI_BAUDSPEED(SPI_InitStruct->SPI_BaudSpeed));
- _ASSERT(IS_SPI_TXLen(SPI_InitStruct->SPI_TXLen));
- _ASSERT(IS_SPI_RXLen(SPI_InitStruct->SPI_RXlen));
-
- SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
- /*set spi control*/
- SpixCtrl = SPI_InitStruct->SPI_BaudSpeed | \
- SPI_InitStruct->SPI_CPOL | \
- SPI_InitStruct->SPI_CPHA | \
- SPI_AUTO_INCR_ADDR;
- HWRITE((uint32_t)&SpiAdr->Ctrl, SpixCtrl);
- #ifdef YC1121B
- /*set spi delay between read and write*/
- HWRITE((uint32_t)&SpiAdr->Dealy, 0x0a);
- /*init spi tx buff*/
- HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr, 0x4f00);
- HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 0);
- /*init spi tx buff*/
- HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr, 0x4f80);
- HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
- #else
- /*set spi delay between read and write*/
- HWRITE((uint32_t)&SpiAdr->Dealy, 0x8a);
- /*init spi tx buff*/
- Ptr = malloc(SPI_InitStruct->SPI_TXLen);
- HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr,(uint32_t) Ptr);
- _ASSERT(Ptr != NULL);
- HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 0);
- Ptr = NULL;
- /*init spi tx buff*/
- Ptr = malloc(SPI_InitStruct->SPI_RXlen);
- HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr,(uint32_t) Ptr);
- _ASSERT(Ptr != NULL);
- HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
- #endif
- }
- void SPI_DeInit(void)
- {
- Spix_RegDef * SpiAdr = NULL;
- SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
- free((void *)((uint32_t)SpiAdr->RxAddr));
- free((void *)((uint32_t)SpiAdr->TxAddr));
- }
- #define START_SPI_DMA 0x02 //start spi dma
- #define CHECK_SPI_DMA_DONE 0x40 //check spi dma is done
- void SPI_SendData(uint16_t Data)
- {
- Spix_RegDef * SpiAdr = NULL;
- uint8_t * SpiTxPtr = NULL;
- SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
- #ifdef YC1121B
- SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- #else
- SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- #endif
- *SpiTxPtr = Data;
- HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 1);
- HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
- HWRITE(CORE_DMA_START, START_SPI_DMA);
- while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
- }
- uint16_t SPI_ReadRegister(uint16_t RegAdr)
- {
- Spix_RegDef * SpiAdr = NULL;
- uint8_t * SpiRxPtr = NULL;
- uint8_t * SpiTxPtr = NULL;
- SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
- #ifdef YC1121B
- SpiRxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
- SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- #else
- SpiRxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
- SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- #endif
- *SpiTxPtr =RegAdr;
-
- HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 1);
- HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 1);
- HWRITE(CORE_DMA_START, START_SPI_DMA);
- while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
- return *SpiRxPtr;
- }
- void SPI_SendDataFromBuff(uint8_t *Buff, uint16_t Len)
- {
- Spix_RegDef * SpiAdr = NULL;
- uint8_t * SpiTxPtr = NULL;
- _ASSERT(Len);
- _ASSERT(Buff != NULL);
- SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
- #ifdef YC1121B
- SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- #else
- SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- #endif
- xmemcpy(SpiTxPtr, Buff, Len);
- HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, Len);
- HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
- HWRITE(CORE_DMA_START, START_SPI_DMA);
- while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
- }
- void SPI_SendDataFromBuffWithoutDMAdone(uint8_t *Buff, uint16_t Len)
- {
- Spix_RegDef * SpiAdr = NULL;
- uint8_t * SpiTxPtr = NULL;
- _ASSERT(Len);
- _ASSERT(Buff != NULL);
- SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
- #ifdef YC1121B
- SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- #else
- SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- #endif
- xmemcpy(SpiTxPtr, Buff, Len);
- HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, Len);
- HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
- HWRITE(CORE_DMA_START, START_SPI_DMA);
- // while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
- }
- uint32_t test;
- void SPI_ReceiveDataToBuff(uint8_t *TxBuff,
- uint16_t TxLen,
- uint8_t *RxBuff,
- uint16_t RxLen)
- {
- Spix_RegDef * SpiAdr = NULL;
- uint8_t * SpiTxPtr = NULL;
- uint8_t * SpiRxPtr = NULL;
- test++;
- _ASSERT(TxLen);
- _ASSERT(TxBuff != NULL);
- _ASSERT(RxBuff != NULL);
- SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
- HWRITE((uint32_t)&SpiAdr->Dealy, 0x8a);
- #ifdef YC1121B
- SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- SpiRxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
- #else
- SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- SpiRxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
- #endif
- // memcpy(SpiTxPtr, TxBuff, TxLen);
-
- HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr, (uint32_t)RxBuff);
- HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr, (uint32_t)TxBuff);
- HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, TxLen);
- HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, RxLen);
- HWRITE(CORE_DMA_START, START_SPI_DMA);
- // while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
-
- // memcpy(RxBuff, SpiRxPtr, RxLen);
- }
- void SPI_ReceiveDataToBuff2(uint8_t *TxBuff,
- uint16_t TxLen,
- uint8_t *RxBuff,
- uint16_t RxLen)
- {
- Spix_RegDef * SpiAdr = NULL;
- uint8_t * SpiTxPtr = NULL;
- uint8_t * SpiRxPtr = NULL;
- _ASSERT(TxLen);
- _ASSERT(TxBuff != NULL);
- _ASSERT(RxBuff != NULL);
- SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
- HWRITE((uint32_t)&SpiAdr->Dealy, 0x0a);
- SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
- SpiRxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
- // memcpy(SpiTxPtr, TxBuff, TxLen);
-
- HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr, (uint32_t)RxBuff);
- HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr, (uint32_t)TxBuff);
- HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, TxLen);
- HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, RxLen);
- HWRITE(CORE_DMA_START, START_SPI_DMA);
- // while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
-
- // memcpy(RxBuff, SpiRxPtr, RxLen);
- }
- bool SPI_WaitDone(void) {
- if(!(HREAD(CORE_DMA_STATUS) & (CHECK_SPI_DMA_DONE))) {
- return true;
- }
- return false;
- }
-
|