27 #ifndef _ADF7030_1__SPI_C_ 30 #define _ADF7030_1__SPI_C_ 38 #include <drivers/spi/adi_spi.h> 41 #include <devices/rf/adf703x/adf7030-1__spi.h> 54 #pragma diag_suppress=Pm073,Pm143 60 uint8_t SPIMem[ADI_SPI_MEMORY_SIZE];
63 ADI_SPI_HANDLE hSPIDevice;
87 if(adi_spi_Open(SPI_DEV_NUM,
90 &hSPIDevice) != ADI_SPI_SUCCESS)
96 if(adi_spi_SetTransmitUnderflow(hSPIDevice,
true) != ADI_SPI_SUCCESS)
102 if(adi_spi_SetBitrate(hSPIDevice, SPI_DEV_BITRATE) != ADI_SPI_SUCCESS)
108 if(adi_spi_SetChipSelect(hSPIDevice, ADI_SPI_CS3) != ADI_SPI_SUCCESS)
114 if(adi_spi_SetClockPhase(hSPIDevice,
false) != ADI_SPI_SUCCESS)
120 if(adi_spi_SetContinousMode(hSPIDevice,
true) != ADI_SPI_SUCCESS)
126 if(adi_spi_EnableDmaMode(hSPIDevice,
false) != ADI_SPI_SUCCESS)
150 if(adi_spi_Close(hSPIDevice) != ADI_SPI_SUCCESS)
174 const uint32_t RateHz
177 if(adi_spi_SetBitrate(hSPIDevice,RateHz) != ADI_SPI_SUCCESS)
200 ADI_SPI_HANDLE hSPIDevice,
222 ADI_SPI_HANDLE hSPIDevice,
248 ADI_SPI_HANDLE hSPIDevice,
260 for(uint32_t
id = PNTR_SRAM_ADDR;
id <= PNTR_CUSTOM2_ADDR;
id++)
263 diff = (int32_t)Addr - (int32_t)ADF7030_1_SPI_PNTR[id];
266 if((diff > 0) && (diff <= 255))
300 ADI_SPI_HANDLE hSPIDevice,
305 ADF7030_1_SPI_PNTR[PNTR_CUSTOM0_ADDR] = Addr;
344 ADI_SPI_HANDLE hSPIDevice,
351 spi_txbuf[3] = ADF703x_SPI_MEM_WRITE |
352 ADF703x_SPI_MEM_BLOCK |
353 ADF703x_SPI_MEM_ADDRESS |
354 ADF703x_SPI_MEM_LONG;
357 *(((uint32_t *)spi_txbuf) + 1) = __REV(AddrIn);
393 ADI_SPI_HANDLE hSPIDevice,
438 ADI_SPI_HANDLE hSPIDevice,
446 spi_txbuf[1] = ADF703x_SPI_MEM_READ |
447 ADF703x_SPI_MEM_BLOCK |
448 ADF703x_SPI_MEM_ADDRESS |
449 ADF703x_SPI_MEM_LONG;
452 *((uint16_t *)spi_txbuf + 1) = __REV16(*((uint16_t *)&AddrIn + 1));
453 *((uint16_t *)spi_txbuf + 2) = __REV16(*((uint16_t *)&AddrIn + 0));
454 *((uint16_t *)spi_txbuf + 3) = 0xFFFF;
489 ADI_SPI_HANDLE hSPIDevice,
496 spi_txbuf[3] = ADF703x_SPI_MEM_WRITE |
497 ADF703x_SPI_MEM_BLOCK |
498 ADF703x_SPI_MEM_POINTER |
499 ADF703x_SPI_MEM_LONG |
533 ADI_SPI_HANDLE hSPIDevice,
575 ADI_SPI_HANDLE hSPIDevice,
583 spi_txbuf[1] = ADF703x_SPI_MEM_READ |
584 ADF703x_SPI_MEM_BLOCK |
585 ADF703x_SPI_MEM_POINTER |
586 ADF703x_SPI_MEM_LONG |
590 *((uint16_t *)spi_txbuf + 1) = 0xFFFF;
625 ADI_SPI_HANDLE hSPIDevice,
633 spi_txbuf[2] = ADF703x_SPI_MEM_WRITE |
634 ADF703x_SPI_MEM_BLOCK |
635 ADF703x_SPI_MEM_ADDRESS |
636 ADF703x_SPI_MEM_SHORT |
640 spi_txbuf[3] = (uint8_t)AddrIn;
674 ADI_SPI_HANDLE hSPIDevice,
719 ADI_SPI_HANDLE hSPIDevice,
728 spi_txbuf[1] = ADF703x_SPI_MEM_READ |
729 ADF703x_SPI_MEM_BLOCK |
730 ADF703x_SPI_MEM_ADDRESS |
731 ADF703x_SPI_MEM_SHORT |
735 spi_txbuf[2] = (uint8_t)AddrIn;
771 ADI_SPI_HANDLE hSPIDevice,
778 spi_txbuf[3] = ADF703x_SPI_MEM_WRITE |
779 ADF703x_SPI_MEM_BLOCK |
780 ADF703x_SPI_MEM_POINTER |
781 ADF703x_SPI_MEM_SHORT |
815 ADI_SPI_HANDLE hSPIDevice,
858 ADI_SPI_HANDLE hSPIDevice,
866 spi_txbuf[2] = ADF703x_SPI_MEM_READ |
867 ADF703x_SPI_MEM_BLOCK |
868 ADF703x_SPI_MEM_POINTER |
869 ADF703x_SPI_MEM_SHORT |
914 ADI_SPI_HANDLE hSPIDevice,
916 uint32_t *pHostOffset,
923 if( num_xfrs > (ADF7030_1_SPI_MAX_TRX_SIZE >> 3))
929 if(pHostOffset == NULL)
935 spi_txbuf[3] = ADF703x_SPI_MEM_WRITE |
936 ADF703x_SPI_MEM_RANDOM |
937 ADF703x_SPI_MEM_ADDRESS |
938 ADF703x_SPI_MEM_LONG;
1004 ADI_SPI_HANDLE hSPIDevice,
1015 uint32_t full_block_cnt = 0;
1018 uint32_t copy_spi_pntr_custom0 = ADF7030_1_SPI_PNTR[PNTR_CUSTOM0_ADDR];
1019 uint32_t copy_spi_pntr_ID = ADF7030_1_SPI_PNTR[PNTR_ID];
1022 bool_t spi_transaction_finished = (nbBytes) ?
false :
true;
1024 while(spi_transaction_finished ==
false)
1028 if( nbBytes > ADF7030_1_SPI_MAX_TRX_SIZE )
1031 size = ADF7030_1_SPI_MAX_TRX_SIZE;
1037 spi_transaction_finished =
true;
1040 if(spi_txbuf[cmdOffset] & ADF703x_SPI_MEM_LONG)
1046 (uint32_t *)pDataIO,
1047 (uint32_t *)pDataRef
1069 if(spi_transaction_finished ==
false)
1071 uint32_t tmp_SPI_Prolog;
1073 switch(spi_txbuf[cmdOffset] & 0x78)
1075 case( ADF703x_SPI_MEM_WRITE | ADF703x_SPI_MEM_BLOCK | ADF703x_SPI_MEM_ADDRESS | ADF703x_SPI_MEM_LONG ) :
1082 *(((uint32_t *)spi_txbuf) + 1) = __REV(Addr);
1086 case( ADF703x_SPI_MEM_READ | ADF703x_SPI_MEM_BLOCK | ADF703x_SPI_MEM_ADDRESS | ADF703x_SPI_MEM_LONG ) :
1093 *((uint16_t *)spi_txbuf + 1) = __REV16(*((uint16_t *)&Addr + 1));
1094 *((uint16_t *)spi_txbuf + 2) = __REV16(*((uint16_t *)&Addr + 0));
1098 case( ADF703x_SPI_MEM_WRITE | ADF703x_SPI_MEM_BLOCK | ADF703x_SPI_MEM_POINTER | ADF703x_SPI_MEM_LONG ) :
1099 case( ADF703x_SPI_MEM_READ | ADF703x_SPI_MEM_BLOCK | ADF703x_SPI_MEM_POINTER | ADF703x_SPI_MEM_LONG ) :
1100 case( ADF703x_SPI_MEM_WRITE | ADF703x_SPI_MEM_BLOCK | ADF703x_SPI_MEM_ADDRESS | ADF703x_SPI_MEM_SHORT ) :
1101 case( ADF703x_SPI_MEM_READ | ADF703x_SPI_MEM_BLOCK | ADF703x_SPI_MEM_ADDRESS | ADF703x_SPI_MEM_SHORT ) :
1102 case( ADF703x_SPI_MEM_WRITE | ADF703x_SPI_MEM_BLOCK | ADF703x_SPI_MEM_POINTER | ADF703x_SPI_MEM_SHORT ) :
1103 case( ADF703x_SPI_MEM_READ | ADF703x_SPI_MEM_BLOCK | ADF703x_SPI_MEM_POINTER | ADF703x_SPI_MEM_SHORT ) :
1113 ADF7030_1_SPI_PNTR[PNTR_CUSTOM0_ADDR] = copy_spi_pntr_ID + (size * ++full_block_cnt);
1116 tmp_SPI_Prolog = *(uint32_t *)spi_txbuf;
1122 *(uint32_t *)spi_txbuf = tmp_SPI_Prolog;
1125 spi_txbuf[cmdOffset] &= 0xF8;
1126 spi_txbuf[cmdOffset] |= PNTR_CUSTOM0_ADDR;
1130 default :
return FAILURE;
1138 pDataIO = (uint8_t *)pDataIO + size;
1142 if(pDataRef != NULL)
1144 pDataRef = (uint8_t *)pDataRef + size;
1152 if(ADF7030_1_SPI_PNTR[PNTR_CUSTOM0_ADDR] != copy_spi_pntr_custom0)
1155 ADF7030_1_SPI_PNTR[PNTR_CUSTOM0_ADDR] = copy_spi_pntr_custom0;
1191 ADI_SPI_HANDLE *hSPIDevice,
1199 ADI_SPI_TRANSCEIVER Transceiver;
1202 uint8_t Addr_en = ((spi_txbuf[offset] & ADF703x_SPI_MEM_ADDRESS) >> 4);
1205 Transceiver.TransmitterBytes = (4 - offset) + ((nb_word + Addr_en) << 2);
1206 Transceiver.ReceiverBytes = Transceiver.TransmitterBytes;
1207 Transceiver.pTransmitter = spi_txbuf + offset;
1208 Transceiver.pReceiver = spi_rxbuf + offset;
1209 Transceiver.nTxIncrement = 1u;
1210 Transceiver.nRxIncrement = Transceiver.nTxIncrement;
1214 uint32_t * pData = (((uint32_t *)spi_txbuf) + 1 + Addr_en);
1216 if(spi_txbuf[offset] & ADF703x_SPI_MEM_READ)
1221 thumb_aligned_memset(pData, 0xFFFFFFFF, nb_word << 2);
1229 for(uint16_t i = 0; i < nb_word; i++)
1231 *pData++ = __REV(*pDataIO++);
1236 if(adi_spi_ReadWrite(*hSPIDevice, &Transceiver) != ADI_SPI_SUCCESS)
1241 if(spi_txbuf[offset] & ADF703x_SPI_MEM_READ)
1246 pData = (((uint32_t *)spi_rxbuf) + 1 + Addr_en);
1248 if((pDataIO != NULL) && (pDataRef == NULL))
1251 for(uint16_t i = 0; i < nb_word; i++)
1253 *pDataIO++ = __REV(*pData++);
1256 else if((pDataIO != NULL) && (pDataRef != NULL))
1261 for(uint16_t i = 0; i < nb_word; i++)
1263 word = __REV(*pData++);
1264 if(*pDataRef++ != word)
1271 else if((pDataIO == NULL) && (pDataRef != NULL))
1274 for(uint16_t i = 0; i < nb_word; i++)
1276 if(*pDataRef++ != __REV(*pData++))
1323 ADI_SPI_HANDLE *hSPIDevice,
1331 ADI_SPI_TRANSCEIVER Transceiver;
1334 Transceiver.TransmitterBytes = (4 - offset) + nb_bytes;
1335 Transceiver.ReceiverBytes = Transceiver.TransmitterBytes;
1336 Transceiver.pTransmitter = spi_txbuf + offset;
1337 Transceiver.pReceiver = spi_rxbuf + offset;
1338 Transceiver.nTxIncrement = 1u;
1339 Transceiver.nRxIncrement = Transceiver.nTxIncrement;
1343 uint32_t * pData = (((uint32_t *)spi_txbuf) + 1);
1346 uint32_t size_alligned = (nb_bytes >> 2) << 2;
1349 uint32_t rem_byte_num_xfrs = nb_bytes & 0x3;
1351 if(spi_txbuf[offset] & ADF703x_SPI_MEM_READ)
1356 if(size_alligned) thumb_aligned_memset(pData, 0xFFFFFFFF, size_alligned);
1359 if(rem_byte_num_xfrs)
1361 uint8_t *pRemData = (uint8_t *)pData + size_alligned;
1363 for(uint32_t i = 0; i < rem_byte_num_xfrs; i++)
1374 if(size_alligned) thumb_aligned_memcpy(pData, pDataIO, size_alligned);
1377 if(rem_byte_num_xfrs)
1379 uint8_t *pRemData = (uint8_t *)pData + size_alligned;
1380 pDataIO += size_alligned;
1382 for(uint32_t i = 0; i < rem_byte_num_xfrs; i++)
1384 *pRemData++ = *pDataIO++;
1390 if(adi_spi_ReadWrite(*hSPIDevice, &Transceiver) != ADI_SPI_SUCCESS)
1395 if(spi_txbuf[offset] & ADF703x_SPI_MEM_READ)
1400 pData = (((uint32_t *)spi_rxbuf) + 1);
1402 if((pDataIO != NULL) && (pDataRef == NULL))
1405 if(size_alligned) thumb_aligned_memcpy(pDataIO, pData, size_alligned);
1408 if(rem_byte_num_xfrs)
1410 uint8_t *pRemData = (uint8_t *)pData + size_alligned;
1411 pDataIO += size_alligned;
1413 for(uint32_t i = 0; i < rem_byte_num_xfrs; i++)
1415 *pDataIO++ = *pRemData++;
1419 else if((pDataIO != NULL) && (pDataRef != NULL))
1422 uint8_t * pDataByte = (uint8_t *)pData;
1425 for(uint16_t i = 0; i < nb_bytes; i++)
1427 byte = *pDataByte++;
1428 if(*pDataRef++ != byte)
1435 else if((pDataIO == NULL) && (pDataRef != NULL))
1437 uint8_t * pDataByte = (uint8_t *)pData;
1440 for(uint16_t i = 0; i < nb_bytes; i++)
1442 if(*pDataRef++ != *pDataByte++)
1486 ADI_SPI_HANDLE *hSPIDevice,
1489 uint32_t *pRemoteAddrIO,
1490 uint32_t *pHostDataIO,
1491 bool pHostDataIO_isArray
1495 ADI_SPI_TRANSCEIVER Transceiver;
1498 uint8_t Write_en = ((~(spi_txbuf[offset]) & ADF703x_SPI_MEM_READ) >> 6);
1502 Transceiver.TransmitterBytes = (4 - offset) + (nb_word << (2 + Write_en));
1503 Transceiver.ReceiverBytes = Transceiver.TransmitterBytes;
1504 Transceiver.pTransmitter = spi_txbuf + offset;
1505 Transceiver.pReceiver = spi_rxbuf + offset;
1506 Transceiver.nTxIncrement = 1u;
1507 Transceiver.nRxIncrement = Transceiver.nTxIncrement;
1510 uint32_t * pData = (((uint32_t *)spi_txbuf) + 1);
1517 for(uint16_t i = 0; i < nb_word; i++)
1519 uint32_t data = *(uint32_t *)pHostDataIO++;
1521 *pData++ = __REV(*pRemoteAddrIO++);
1522 *pData++ = __REV((pHostDataIO_isArray ==
true) ? *(uint32_t *)data : data);
1530 for(uint16_t i = 0; i < nb_word; i++)
1532 *pData++ = __REV(*pRemoteAddrIO++);
1536 Transceiver.TransmitterBytes += 2;
1537 Transceiver.ReceiverBytes = Transceiver.TransmitterBytes;
1540 *(uint16_t *)pData = 0xFFFF;
1544 if(adi_spi_ReadWrite(*hSPIDevice, &Transceiver) != ADI_SPI_SUCCESS)
1554 uint16_t *pDataOut = (((uint16_t *)spi_rxbuf) + 4);
1557 for(uint16_t i = 0; i < ((nb_word << 1) + 1); i++)
1561 data = __REV16(*pDataOut++) << 16;
1562 data |= __REV16(*pDataOut++);
1564 if(pHostDataIO_isArray ==
true)
1566 *pHostDataIO++ = data;
1570 uint32_t * pHostData = pHostDataIO++;
uint32_t adf7030_1__SPI_word_random_transaction(ADI_SPI_HANDLE *hSPIDevice, uint32_t offset, uint32_t nb_word, uint32_t *pAddrIO, uint32_t *pDataIO, bool pDataIO_is_pointer)
Generic SPI Random Read/Write a number of words(s) to the adf7030-1.
uint32_t adf7030_1__SPI_wr_byte_p_a(ADI_SPI_HANDLE hSPIDevice, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE pntrID, uint32_t num_xfrs, uint8_t *pDataIn)
Write a number of byte(s) from Host to memory of the adf7030-1 starting at location pointed by "pntr"...
uint32_t adf7030_1__SPI_rd_word_b_a(ADI_SPI_HANDLE hSPIDevice, uint32_t AddrIn, uint32_t num_xfrs, uint32_t *pDataOut)
Read a number of word(s) from the adf7030-1 to memory of Host Generic 32bits bloc address read from m...
uint32_t adf7030_1__SPI_word_block_transaction(ADI_SPI_HANDLE *hSPIDevice, uint32_t offset, uint32_t nb_bytes, uint32_t *pDataIO, uint32_t *pDataRef)
Generic SPI Block Read/Write a number of words(s) to the adf7030-1.
#define ADF7030_1_SPI_BUFFER_SIZE
uint32_t adf7030_1__SPI_SetMMapCustomPntr0(ADI_SPI_HANDLE hSPIDevice, uint32_t Addr)
Change the SPI Radio mmap custom pointers 0 location.
uint32_t adf7030_1__SPI_GetMMapPointers(ADI_SPI_HANDLE hSPIDevice, uint32_t *pPNTR)
Get SPI Radio mmap pointers access.
uint32_t adf7030_1__SPI_rd_byte_p_a(ADI_SPI_HANDLE hSPIDevice, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE pntrID, uint32_t num_xfrs, uint8_t *pDataOut)
Read a number of bytes(s) from memory of the adf7030-1 to Host starting at location pointed by "pntr"...
uint32_t adf7030_1__SPI_rd_cmp_word_b_a(ADI_SPI_HANDLE hSPIDevice, uint32_t AddrIn, uint32_t num_xfrs, uint32_t *pDataOut, uint32_t *pDataRef)
Read & Compare a number of word(s) from the adf7030-1 to memory of Host Generic 32bits bloc address r...
uint32_t adf7030_1__SPI_SetSpeed(const uint32_t RateHz)
Change SPI Host to PHY Communication bitrate.
uint32_t adf7030_1__SPI_rd_cmp_byte_b_a(ADI_SPI_HANDLE hSPIDevice, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE pntrID, uint32_t AddrIn, uint32_t num_xfrs, uint8_t *pDataOut, uint8_t *pDataRef)
Read & Compare a number of bytes(s) from memory of the adf7030-1 to Host starting at location pointed...
uint32_t adf7030_1__SPI_rd_word_b_p(ADI_SPI_HANDLE hSPIDevice, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE pntrID, uint32_t num_xfrs, uint32_t *pDataOut)
Read a number of word(s) from memory of the adf7030-1 to Host starting at location pointed by "pntr" ...
uint32_t adf7030_1__SPI_wr_word_b_p(ADI_SPI_HANDLE hSPIDevice, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE pntrID, uint32_t num_xfrs, uint32_t *pDataIn)
Write a number of word(s) from Host to memory of the adf7030-1 starting at location pointed by "pntr"...
void adf7030_1__SPI_FindMMapPointer(ADI_SPI_HANDLE hSPIDevice, uint32_t Addr, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE *pPNTR_ID, int32_t *ByteOffset)
This function return the best Pointer id + offset for subsequent SPI transfert to the PHY "Addr" prov...
uint32_t adf7030_1__SPI_wr_word_r_a(ADI_SPI_HANDLE hSPIDevice, uint32_t AddrIn, uint32_t *pHostOffset, uint32_t *pAddrIn, uint32_t *pDataIn, uint32_t num_xfrs)
Write a number of word(s) from Host to memory of the adf7030-1 Generic 32bits random address write to...
ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE
uint32_t adf7030_1__SPI_rd_byte_b_a(ADI_SPI_HANDLE hSPIDevice, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE pntrID, uint32_t AddrIn, uint32_t num_xfrs, uint8_t *pDataOut)
Read a number of bytes(s) from memory of the adf7030-1 to Host starting at location pointed by "pntr"...
uint32_t adf7030_1__SPI_Block_Xfer(ADI_SPI_HANDLE hSPIDevice, uint32_t cmdOffset, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE PNTR_ID, uint32_t Addr, uint32_t nbBytes, void *pDataIO, void *pDataRef)
Generic function to read or write a number of bytes between the Host and the PHY adf703x.
uint32_t adf7030_1__SPI_UnInit(void)
Uninitializes SPI device used to communication with the adf7030-1 PHY.
uint32_t adf7030_1__SPI_rd_cmp_word_b_p(ADI_SPI_HANDLE hSPIDevice, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE pntrID, uint32_t num_xfrs, uint32_t *pDataOut, uint32_t *pDataRef)
Read & Compare a number of word(s) from memory of the adf7030-1 to Host starting at location pointed ...
uint32_t adf7030_1__SPI_wr_word_b_a(ADI_SPI_HANDLE hSPIDevice, uint32_t AddrIn, uint32_t num_xfrs, uint32_t *pDataIn)
Write a number of word(s) from Host to memory of the adf7030-1 Generic 32bits bloc address write to m...
uint32_t adf7030_1__SPI_byte_block_transaction(ADI_SPI_HANDLE *hSPIDevice, uint32_t offset, uint32_t nb_bytes, uint8_t *pDataIO, uint8_t *pDataRef)
Generic SPI Block Read/Write a number of byte(s) to the adf7030-1.
uint32_t adf7030_1__SPI_wr_byte_b_a(ADI_SPI_HANDLE hSPIDevice, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE pntrID, uint32_t AddrIn, uint32_t num_xfrs, uint8_t *pDataIn)
Write a number of byte(s) from Host to memory of the adf7030-1 starting at location pointed by "pntr"...
uint32_t adf7030_1__SPI_Init(void)
Initializes SPI device for communication with the adf7030-1 PHY.
uint32_t adf7030_1__SPI_rd_cmp_byte_p_a(ADI_SPI_HANDLE hSPIDevice, ADI_ADF7030_1_RADIO_SPI_PNTR_TYPE pntrID, uint32_t num_xfrs, uint8_t *pDataOut, uint8_t *pDataRef)
Read & Compare a number of bytes(s) from memory of the adf7030-1 to Host starting at location pointed...
uint32_t adf7030_1__SPI_SetMMapPointers(ADI_SPI_HANDLE hSPIDevice, uint32_t *pPNTR)
Set SPI Radio mmap pointers access.