34 #if defined(CHIP_LPC43XX)
49 STATIC void executeCallback(LPC_SPI_T *pSPI, SPI_CALLBACK_T pfunc)
57 STATIC void writeData(LPC_SPI_T *pSPI, SPI_DATA_SETUP_T *pXfSetup, uint32_t num_bytes)
59 uint16_t data2write = 0xFFFF;
61 if ( pXfSetup->pTxData) {
62 data2write = pXfSetup->pTxData[pXfSetup->cnt];
64 data2write |= pXfSetup->pTxData[pXfSetup->cnt + 1] << 8;
68 Chip_SPI_SendFrame(pSPI, data2write);
73 STATIC void readData(LPC_SPI_T *pSPI, SPI_DATA_SETUP_T *pXfSetup, uint16_t rDat, uint32_t num_bytes)
75 rDat = Chip_SPI_ReceiveFrame(pSPI);
76 if (pXfSetup->pRxData) {
77 pXfSetup->pRxData[pXfSetup->cnt] = rDat;
79 pXfSetup->pRxData[pXfSetup->cnt + 1] = rDat >> 8;
89 uint32_t Chip_SPI_RWFrames_Blocking(LPC_SPI_T *pSPI, SPI_DATA_SETUP_T *pXfSetup)
92 uint16_t rDat = 0x0000;
96 Chip_SPI_Int_FlushData(pSPI);
98 if (Chip_SPI_GetDataSize(pSPI) != SPI_BITS_8) {
102 executeCallback(pSPI, pXfSetup->fnBefTransfer);
104 while (pXfSetup->cnt < pXfSetup->length) {
106 executeCallback(pSPI, pXfSetup->fnBefFrame);
109 writeData(pSPI, pXfSetup, bytes);
113 status = Chip_SPI_GetStatus(pSPI);
115 if (status & SPI_SR_ERROR) {
118 if (status & SPI_SR_SPIF) {
123 executeCallback(pSPI, pXfSetup->fnAftFrame);
126 readData(pSPI, pXfSetup, rDat, bytes);
127 pXfSetup->cnt += bytes;
131 executeCallback(pSPI, pXfSetup->fnAftTransfer);
132 return pXfSetup->cnt;
136 void Chip_SPI_Int_FlushData(LPC_SPI_T *pSPI)
138 volatile uint32_t tmp;
139 Chip_SPI_GetStatus(pSPI);
140 tmp = Chip_SPI_ReceiveFrame(pSPI);
141 Chip_SPI_Int_ClearStatus(pSPI, SPI_INT_SPIF);
145 Status Chip_SPI_Int_RWFrames(LPC_SPI_T *pSPI, SPI_DATA_SETUP_T *pXfSetup, uint8_t bytes)
148 uint16_t rDat = 0x0000;
150 status = Chip_SPI_GetStatus(pSPI);
152 if (status & SPI_SR_ERROR) {
156 Chip_SPI_Int_ClearStatus(pSPI, SPI_INT_SPIF);
157 if (status & SPI_SR_SPIF) {
158 executeCallback(pSPI, pXfSetup->fnAftFrame);
159 if (pXfSetup->cnt < pXfSetup->length) {
161 readData(pSPI, pXfSetup, rDat, bytes);
162 pXfSetup->cnt += bytes;
166 if (pXfSetup->cnt < pXfSetup->length) {
168 executeCallback(pSPI, pXfSetup->fnBefFrame);
171 writeData(pSPI, pXfSetup, bytes);
174 executeCallback(pSPI, pXfSetup->fnAftTransfer);
180 Status Chip_SPI_Int_RWFrames8Bits(LPC_SPI_T *pSPI, SPI_DATA_SETUP_T *pXfSetup)
182 return Chip_SPI_Int_RWFrames(pSPI, pXfSetup, 1);
186 Status Chip_SPI_Int_RWFrames16Bits(LPC_SPI_T *pSPI, SPI_DATA_SETUP_T *pXfSetup)
188 return Chip_SPI_Int_RWFrames(pSPI, pXfSetup, 2);
192 void Chip_SPI_SetBitRate(LPC_SPI_T *pSPI, uint32_t bitRate)
194 uint32_t spiClk, counter;
198 counter = spiClk / bitRate;
202 counter = ((counter + 1) / 2) * 2;
208 Chip_SPI_SetClockCounter(pSPI, counter);
212 void Chip_SPI_Init(LPC_SPI_T *pSPI)
216 Chip_SPI_SetMode(pSPI, SPI_MODE_MASTER);
217 pSPI->CR = (pSPI->CR & (~0xF1C)) | SPI_CR_BIT_EN | SPI_BITS_8 | SPI_CLOCK_CPHA0_CPOL0 | SPI_DATA_MSB_FIRST;
218 Chip_SPI_SetBitRate(pSPI, 400000);
222 void Chip_SPI_DeInit(LPC_SPI_T *pSPI)