能否出一版只有純藍(lán)牙底層驅(qū)動的例程

如題,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 ************************************/

附完整代碼

icon_rar.gifrx_tx_switch 雙向通信.rar




熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

我們的evt中也有很多關(guān)于藍(lán)牙使用的demo可供參考,這是注釋是使用的英文,如果理解有困難的話可以翻譯成中文。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频