如題,ch57X系列確實(shí)是很不錯(cuò)的芯片,把無線和單片機(jī)結(jié)合起來了。但是入門例程對我們這種非科班出身的入門愛好者十分的不友好。能否出一版類似如nRF24L01,xn297l?的c程序。
附xn297l的c驅(qū)動程序
//===================================================================================//
// ?* @file ? ? ? ? ? rf.c
// ?* @author ? ? ? ? liuhaibing
// ?* @version ? ? ? ?V1.0.0
// ?* @date ? ? ? ? ? 2021/05/14
// ?* @brief ? ? ? ? ?4線SPI,2M/1M速率,軟件CE,無IRQ
//===================================================================================//
#include"rf.h"
uint8_t TX_ADDRESS_DEF[5] = {0xCC,0xCC,0xCC,0xCC,0xCC};
/******************************************************************************/
// !!!!!!!!!!!!!!!!!!!!該部分內(nèi)容需要修改!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// @brief ?實(shí)現(xiàn)1ms延時(shí),該部分內(nèi)容需要用戶根據(jù)自己實(shí)際使用的MCU做修改
// @param ?n_ms:需要延時(shí)的時(shí)間,單位為ms
// @retval None ? ? ? ? ? ?
/******************************************************************************/
void delay_ms(u16 n_ms)
{
? ?uint16_t i,j;
? ?for(i=0;i<n_ms;i++)
? ?{
? ? ? ?for(j=0;j<2300;j++)
? ? ? ?{
? ? ? ? ? ?nop();
? ? ? ?}
? ?}
}
/******************************************************************************/
// !!!!!!!!!!!!!!!!!!!!該部分內(nèi)容需要修改!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// @brief ?實(shí)現(xiàn)100us延時(shí),該部分內(nèi)容需要用戶根據(jù)自己實(shí)際使用的MCU做修改
// @param ?n_100us:需要延時(shí)的時(shí)間,單位為100us
// @retval ?None ? ? ? ? ? ?
/******************************************************************************/
void delay_100us(u16 n_100us)
{
? ?uint16_t i,j;
? ?for(i=0;i<n_100us;i++)
? ?{
? ? ? ?for(j=0;j<225;j++)
? ? ? ?{
? ? ? ? ? ?nop();
? ? ? ?}
? ?}
}
/******************************************************************************/
// !!!!!!!!!!!!!!!!!!!!該部分內(nèi)容需要修改!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// @brief ?初始化SPI,該部分內(nèi)容需要用戶根據(jù)自己實(shí)際使用的MCU和實(shí)際情況(比如是否使用到IRQ,CE腳等)做修改
// @param ?None
// @retval ?None ? ? ? ? ? ?
/******************************************************************************/
void SPI_init(void)
{
? ? GPIO_Init( GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Fast); ? ? ? ? ? ? ? ? ?//CSN ?output High pulling push
? ? GPIO_Init( GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_Low_Fast); ? ? ? ? ? ? ? ? ? //SCK ?output Low ?pulling push
? ? GPIO_Init( GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast); ? ? ? ? ? ? ? ? ?//MOSI output High pulling push
? ? GPIO_Init( GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); ? ? ? ? ? ? ? ? ? ? ? //MISO input pull high
}
/******************************************************************************/
// @brief ?SPI寫入一個(gè)BYTE的同時(shí),讀出一個(gè)BYTE返回
// @param ?R_REG:SPI寫入的值
// @retval SPI讀出的值 ? ? ? ? ? ?
/******************************************************************************/
?uint8_t SPI_RW( uint8_t R_REG)
?{
? ? uint8_t ? i;
? ? for(i = 0; i < 8; i++)
? ? {
? ? ? ? SCK_LOW;
? ? ? ? if(R_REG & 0x80)
? ? ? ? {
? ? ? ? ? ? MOSI_HIGH;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? MOSI_LOW;
? ? ? ? }
? ? ? ? R_REG = R_REG << 1;
? ? ? ? SCK_HIGH;
? ? ? ? if( MISO_STATUS )
? ? ? ? {
? ? ? ? ? R_REG = R_REG | 0x01;
? ? ? ? }
? ? }
? ? SCK_LOW;
? ? return R_REG;
?}
? ?
? ?
/******************************************************************************/
// @brief ?RF寄存器設(shè)置
// @param ?reg:寫命令W_REGISTER+寄存器地址(比如CONFIG為0x00)
// ? ? ? ? wdata:需要為寄存器設(shè)置的值 ?
// @retval None ? ? ? ? ? ?
/******************************************************************************/
void RF_WriteReg( uint8_t reg, ?uint8_t wdata)
{
? ? CSN_LOW;
? ? SPI_RW(reg);
? ? SPI_RW(wdata);
? ? CSN_HIGH;
}
/******************************************************************************/
// @brief ?RF寄存器讀取
// @param ?reg:讀命令R_REGISTER+寄存器地址(比如CONFIG為0x00)
// @retval 讀取到的寄存器值 ? ? ? ? ? ?
/******************************************************************************/
?uint8_t RF_ReadReg( uint8_t reg)
{
? ? uint8_t tmp;
? ?
? ? CSN_LOW;
? ? SPI_RW(reg);
? ? tmp = SPI_RW(0);
? ? CSN_HIGH;
? ?
? ? return tmp;
}
/******************************************************************************/
// @brief ?RF寄存器設(shè)置
// @param ?reg:寫命令W_REGISTER+寄存器地址
// ? ? ? ? pBuf:待寫入數(shù)據(jù)的起始地址
// ? ? ? ? length: 待寫入數(shù)據(jù)的長度
// @retval None ? ? ? ? ?
/******************************************************************************/
void RF_WriteBuf( uint8_t reg, uint8_t *pBuf, uint8_t length)
{
? ? ?uint8_t j;
? ? CSN_LOW;
? ? j = 0;
? ? SPI_RW(reg);
? ? for(j = 0;j < length; j++)
? ? {
? ? ? ? SPI_RW(pBuf[j]);
? ? }
? ? j = 0;
? ? CSN_HIGH;
}
/******************************************************************************/
// @brief ?RF寄存器讀取
// @param ?reg:讀命令R_REGISTER+寄存器地址
// ? ? ? ? pBuf:讀取數(shù)據(jù)存放的起始地址
// ? ? ? ? length: 待寫讀取數(shù)據(jù)的長度
// @retval None
/******************************************************************************/
void RF_ReadBuf( uint8_t reg, uint8_t *pBuf, ?uint8_t length)
{
? ? uint8_t byte_ctr;
? ? CSN_LOW; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? SPI_RW(reg); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? for(byte_ctr=0;byte_ctr<length;byte_ctr++)
? ? ? ? pBuf[byte_ctr] = SPI_RW(0); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? CSN_HIGH; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
}
/******************************************************************************/
// @brief ?RF設(shè)置為TX mode
// @param ?None
// @retval None
/******************************************************************************/
void RF_TxMode(void)
{
? ? RF_WriteReg(W_REGISTER + CONFIG, ?0X8E);
? ? CE_LOW;
}
/******************************************************************************/
// @brief ?RF設(shè)置為RX mode
// @param ?None
// @retval None
/******************************************************************************/
void RF_RxMode(void)
{
? ? RF_WriteReg(W_REGISTER + CONFIG, ?0X8F ); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? delay_ms(10); ?
? ? CE_HIGH; ? ?
? ? delay_ms(10);
}
/******************************************************************************/
// @brief ?讀取RF狀態(tài)標(biāo)志
// @param ?None
// @retval 讀出的狀態(tài)值
// ? ? ? ? bit6:收到數(shù)據(jù)標(biāo)志
// ? ? ? ? bit5:發(fā)射成功標(biāo)志
// ? ? ? ? bit4:發(fā)射超時(shí)標(biāo)志
// ? ? ? ? bit3-1:讀取到數(shù)據(jù)后,判斷是哪個(gè)通道接收,此處用不到
// ? ? ? ? bit0: TX FIFO狀態(tài)標(biāo)志,此處用不到 ? ?
/******************************************************************************/
uint8_t RF_GetStatus(void)
{
? ? return RF_ReadReg(STATUS)&0x70;
}
/******************************************************************************/
// @brief ?清除RF狀態(tài)標(biāo)志
// @param ?None
// @retval None
/******************************************************************************/
void RF_ClearStatus(void)
{
? ? RF_WriteReg(W_REGISTER + STATUS,0x70);
}
/******************************************************************************/
// @brief ?清除RF FIFO,可根據(jù)實(shí)際情況單獨(dú)清除TX_FIFO或RX_FIFO
// @param ?None
// @retval None
/******************************************************************************/
void RF_ClearFIFO(void)
{
? ? RF_WriteReg(FLUSH_TX, 0); ? //清除RF 的 TX FIFO ? ? ? ?
? ? RF_WriteReg(FLUSH_RX, 0); ? //清除RF 的 RX FIFO ? ?
}
/******************************************************************************/
// @brief ?設(shè)置RF頻道
// @param ?Channel:待設(shè)置的頻點(diǎn)為“2400+Channel”MHz
// @retval None
/******************************************************************************/
void RF_SetChannel( uint8_t Channel)
{ ? ?
? ? RF_WriteReg(W_REGISTER + RF_CH, Channel);
}
/******************************************************************************/
// @brief ?RF發(fā)射數(shù)據(jù)
// @param ?ucPayload:發(fā)射數(shù)據(jù)的起始地址
// ? ? ? ? length:發(fā)射數(shù)據(jù)長度 ? ?
// @retval None
/******************************************************************************/
void RF_TxData( uint8_t *ucPayload, ?uint8_t length)
{
? ? CE_HIGH;
? ? delay_100us(1);
? ? RF_WriteBuf(W_TX_PAYLOAD, ucPayload, length); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //rf entery tx mode start send data ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //rf entery stb3
? ? delay_ms(1);
? ? while(!(RF_GetStatus()&TX_DS_FLAG))
? ? {
? ? ? ? delay_ms(1); ?
? ? }
? ? RF_WriteReg(FLUSH_TX, 0); ? //清除RF的TX FIFO
? ? RF_ClearStatus();
? ? CE_LOW;
}
/******************************************************************************/
// @brief ?RF接收數(shù)據(jù)
// @param ?ucPayload:接收數(shù)據(jù)存放的起始地址
// ? ? ? ? length:接收數(shù)據(jù)長度 ? ?
// @retval 1:收到數(shù)據(jù)
// ? ? ? ? 0: 沒有收到數(shù)據(jù) ? ? ? ? ? ? ?
/******************************************************************************/
uint8_t RF_DumpRxData( uint8_t *ucPayload, ?uint8_t length)
{
?
? ? if(!(RF_GetStatus()& RX_DR_FLAG))
? ? {
? ? ? ?return 0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }
? ? RF_ReadBuf(R_RX_PAYLOAD, ucPayload, length); ? ? ?//將接收到的數(shù)據(jù)讀出到ucPayload
? ? RF_WriteReg(FLUSH_RX, 0); ? //清除RF的RX FIFO
? ? RF_ClearStatus();
? ? return 1;
}
/******************************************************************************/
// @brief ?RF初始化
// @param ?None
// @retval 1:初始化成功
// ? ? ? ? 0: 初始化失敗 ? ? ? ? ? ?
/******************************************************************************/
uint8_t RF_Init(void)
{
? ? uint8_t BB_cal_data[] ? = {0x12,0xED,0x67,0x9C,0x46};
? ? uint8_t RF_cal_data[] ? = {0xF6,0x3F,0x5D};
? ? uint8_t RF_cal2_data[] ?= {0x45,0x21,0xEF,0x2C,0x5A,0x40};
? ? uint8_t Dem_cal_data[] ?= {0x01};
? ? uint8_t Dem_cal2_data[] = {0x0B,0xDF,0x02};
? ? uint8_t feature = 0x20; ?//使用軟件CE
? ? SPI_init();
? ? ? ? ? ? ? ? ? ?
? ? RF_WriteReg(RST_FSPI, 0x5A); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//Software Reset ? ? ? ? ? ? ? ?
? ? RF_WriteReg(RST_FSPI, 0XA5);
? ?
? ? RF_WriteReg(FLUSH_TX, 0); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // CLEAR TXFIFO ? ? ? ? ? ? ? ? ? ? ?
? ? RF_WriteReg(FLUSH_RX, 0); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // CLEAR ?RXFIFO
? ? RF_WriteReg(W_REGISTER + STATUS, 0x70); ? ? ? ? ? ? ? ? ? ? ? ? // CLEAR ?STATUS ? ?
? ? RF_WriteReg(W_REGISTER + EN_RXADDR, 0x01); ? ? ? ? ? ? ? ? ? ? ? ? ?// Enable Pipe0
? ? RF_WriteReg(W_REGISTER + SETUP_AW, ?0x03); ? ? ? ? ? ? ? ? ? ? ? ? ?// address witdth is 5 bytes
? ? RF_WriteReg(W_REGISTER + RF_CH, ? ? DEFAULT_CHANNEL); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 2478M HZ
? ? RF_WriteReg(W_REGISTER + RX_PW_P0, PAYLOAD_WIDTH ); ? ? ? ? ? ? ? ? ? ? // 8 bytes
? ? RF_WriteBuf(W_REGISTER + TX_ADDR, ?TX_ADDRESS_DEF, sizeof(TX_ADDRESS_DEF)); ? ? ? ? ? ? ? ? // Writes TX_Address to XN297L
? ? RF_WriteBuf(W_REGISTER + RX_ADDR_P0,TX_ADDRESS_DEF, sizeof(TX_ADDRESS_DEF)); ? ? ? ? ? ?// RX_Addr0 same as TX_Adr for Auto.Ack ?
?
? ? RF_WriteBuf(W_REGISTER + BB_CAL, ? ?BB_cal_data, ?sizeof(BB_cal_data));
? ? RF_WriteBuf(W_REGISTER + RF_CAL2, ? RF_cal2_data, sizeof(RF_cal2_data));
? ? RF_WriteBuf(W_REGISTER + DEM_CAL, ? Dem_cal_data, sizeof(Dem_cal_data));
? ? RF_WriteBuf(W_REGISTER + RF_CAL, ? ?RF_cal_data, ?sizeof(RF_cal_data));
? ? RF_WriteBuf(W_REGISTER + DEM_CAL2, ?Dem_cal2_data,sizeof(Dem_cal2_data));
? ? RF_WriteReg(W_REGISTER + DYNPD, 0x00); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? RF_WriteReg(W_REGISTER + RF_SETUP, ?RF_POWER); ? ? ? ? ? ? ? ? ? ? ?// 9dbm ?1Mbps ? ? ?
? ? RF_WriteReg(ACTIVATE, 0x73);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? RF_WriteReg(W_REGISTER + SETUP_RETR,0x00); ? ? ? ? ? ? ? ? ? ? ? ? ?// Disable retrans... ?
? ? RF_WriteReg(W_REGISTER + EN_AA, ? ? 0x00); ? ? ? ? ? ? ? ? ? ? ? ? ?// Disable AutoAck
? ? if(PAYLOAD_WIDTH >32)
? ? ? feature |= 0x18;
? ? RF_WriteReg(W_REGISTER + FEATURE, feature);
? ?
? ? if(RF_ReadReg(RF_CH)!=DEFAULT_CHANNEL)
? ? ? return 0;
? ? return 1;
}
/******************************************************************************/
// @brief ?RF設(shè)置為載波模式
// @param ?ucChannel_Set:載波的頻點(diǎn)
// @retval None ? ? ? ? ? ?
/******************************************************************************/
void RF_Carrier( uint8_t ucChannel_Set)
{
? ? uint8_t BB_cal_data[] ? = {0x12,0xED,0x67,0x9C,0x46};
? ? uint8_t RF_cal_data[] ? = {0xF6,0x3F,0x5D};
? ? uint8_t RF_cal2_data[] ?= {0x45,0x21,0xEF,0x2C,0x5A,0x40};
? ? uint8_t Dem_cal_data[] ?= {0xE1};
? ? uint8_t Dem_cal2_data[] = {0x0B,0xDF,0x02}; ? ? ?
? ? RF_WriteReg(RST_FSPI, 0x5A); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//Software Reset ? ? ? ? ? ? ? ?
? ? RF_WriteReg(RST_FSPI, 0XA5);
? ? uint8_t feature = 0x20; //使用軟件CE
?
? ? RF_WriteReg(W_REGISTER + FEATURE, feature);
? ?
? ? CE_LOW;
? ? delay_100us(5); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //delay 500us
? ? RF_WriteReg(W_REGISTER + CONFIG, 0X8E); ? ? ? ? ? ? ? ? ? ? ? ? ? ? //tx mode
? ? RF_WriteReg(W_REGISTER + RF_CH, ucChannel_Set); ? ? ? ? ? ? ? ? ? ? //單載波頻點(diǎn) ? ?
? ? RF_WriteReg(W_REGISTER + RF_SETUP, RF_POWER); ? ? ? ? ? ? ? ? ? ? ? ? ? //9dbm
? ? RF_WriteBuf(W_REGISTER + BB_CAL, ? ?BB_cal_data, ?sizeof(BB_cal_data));
? ? RF_WriteBuf(W_REGISTER + RF_CAL2, ? RF_cal2_data, sizeof(RF_cal2_data));
? ? RF_WriteBuf(W_REGISTER + DEM_CAL, ? Dem_cal_data, sizeof(Dem_cal_data));
? ? RF_WriteBuf(W_REGISTER + RF_CAL, ? ?RF_cal_data, ?sizeof(RF_cal_data));
? ? RF_WriteBuf(W_REGISTER + DEM_CAL2, ?Dem_cal2_data,sizeof(Dem_cal2_data));
? ? delay_100us(5);
}
/***************************************end of file ************************************/
附完整代碼