|
cc2500的底層驅(qū)動 C程序 而且可移植:
0.png (60.18 KB, 下載次數(shù): 156)
下載附件
2017-2-19 17:45 上傳
全部源碼下載:
Desktop.zip
(13.7 KB, 下載次數(shù): 79)
2017-2-19 12:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
單片機主程序預(yù)覽:
- #include "CC2500.h" // CC2500無線數(shù)傳模塊驅(qū)動頭文件
- #define C25_Pin_CSn(x) PORTB_PB5 = x // 芯片選擇 (MCU output)
- #define C25_Pin_SCLK(x) PORTB_PB1 = x // 時鐘輸入 (MCU output)
- #define C25_Pin_SI(x) PORTB_PB0 = x // 數(shù)據(jù)輸入 (MCU output)
- #define C25_Pin_SO PORTB_PB2 // 數(shù)據(jù)輸出 (MCU input)
- #define C25_Pin_GDO0 PORTB_PB4 // 通用輸出 (MCU input)
- //#define C25_Pin_GDO2 PORTB_PJ6 // 通用輸入 (MCU input)
- byte C25_Send_Buff[C25_Buff_Len]={1,2,3,4,5,6,7,8,9,10};// 發(fā)送數(shù)據(jù)緩沖區(qū)
- byte C25_Rece_Buff[C25_Buff_Len]={0}; // 接收數(shù)據(jù)緩沖區(qū)
- byte flag_send_ok = 0; //發(fā)送完成標(biāo)志位 0完成 1正在發(fā)送
- // 函數(shù): C25_Soft_Dly()
- // 描述: 軟件延時 10us
- // 參數(shù): 無
- void C25_Soft_Dly(int ms)
- {
- int ii,jj;
- if (ms<1) ms=1;
- for(ii=0;ii<ms;ii++)
- for(jj=0;jj<200;jj++); //K60默認(rèn)頻率for(jj=0;jj<160;jj++);
- }
- // 函數(shù): C25_SPI_WR_Byte()
- // 描述: 通過SPI寫一個byte到CC2500,同時從CC2500讀取一個Byte
- // 參數(shù): byte 待寫入字節(jié)數(shù)據(jù)
- // return 讀取到的字節(jié)數(shù)據(jù)
- byte C25_SPI_WR_Byte(byte temp)
- {
- byte j;
- for(j=0; j<8; j++) // 循環(huán)8次
- {
- C25_Pin_SI((temp & 0x80)>>7); // 將byte最高位輸出到SI
- temp <<= 1; // 低一位移位到最高位
- C25_Pin_SCLK(1); // 拉高SLCK,CC2500從SI讀入1位數(shù)據(jù),同時CC2500從SO輸出1位數(shù)據(jù)
- temp |= C25_Pin_SO; // 讀SO到byte最低位
- C25_Pin_SCLK(0); // SCLK置低
- }
- return(temp); // 返回讀取的1Byte數(shù)據(jù)
- }
- // 函數(shù): C25_SPI_W_Cmd_Strobes()
- // 描述: 向芯片中寫入指令控制字
- // 參數(shù): cmd 待寫入的指令控制字
- void C25_SPI_W_Cmd_Strobes(byte cmd)
- {
- C25_Pin_CSn(0); // CSn置低,開始數(shù)據(jù)傳輸過程
- (void)C25_SPI_WR_Byte(C25_RW_WRITE_SINGLE | cmd); // 寫入指令控制字
- C25_Pin_CSn(1); // CSn置高,結(jié)束數(shù)據(jù)傳輸過程
- }
- // 函數(shù): C25_SPI_W_Reg_Single()
- // 描述: 向1個寄存器中寫入數(shù)據(jù),同時讀取狀態(tài)字
- // 參數(shù): addr 待寫入的寄存器地址
- // value 待寫入的字節(jié)數(shù)據(jù)
- // return 讀取到狀態(tài)字
- byte C25_SPI_W_Reg_Single(byte addr,byte value)
- {
- byte status;
- C25_Pin_CSn(0); // CSn置低,開始數(shù)據(jù)傳輸過程
- (void)C25_SPI_WR_Byte(C25_RW_WRITE_SINGLE | addr); // 寫入寄存器地址及讀寫控制
- status = C25_SPI_WR_Byte(value); // 寫入寄存器數(shù)值,并讀取狀態(tài)字
- C25_Pin_CSn(1); // CSn置高,結(jié)束數(shù)據(jù)傳輸過程
- return(status); // 返回狀態(tài)字
- }
- // 函數(shù): C25_SPI_W_Reg_Burst()
- // 描述: 向寄存器中寫入多個數(shù)據(jù)
- // 參數(shù): addr 待寫入的寄存器首地址
- // *p 待寫入的數(shù)據(jù)首地址
- // num 待寫入的數(shù)據(jù)長度
- void C25_SPI_W_Reg_Burst(byte addr,byte num,byte *p)
- {
- byte j;
- C25_Pin_CSn(0); // CSn置低,開始數(shù)據(jù)傳輸過程
- (void)C25_SPI_WR_Byte(C25_RW_WRITE_BURST | addr); // 寫入寄存器地址及讀寫控制(多字節(jié))
- for(j=0; j<num; j++)
- {
- (void)C25_SPI_WR_Byte(p[j]); // 寫入寄存器數(shù)值
- }
- C25_Pin_CSn(1); // CSn置高,結(jié)束數(shù)據(jù)傳輸過程
- }
- // 函數(shù): C25_SPI_R_Reg_Burst()
- // 描述: 從寄存器中讀取多個數(shù)據(jù)
- // 參數(shù): addr 待讀取的寄存器首地址
- // *p 待讀取的寄存器數(shù)據(jù)存放首地址
- // num 待讀取的數(shù)據(jù)長度
- void C25_SPI_R_Reg_Burst(byte addr,byte num,byte *p)
- {
- byte j;
- C25_Pin_CSn(0); // CSn置低,開始數(shù)據(jù)傳輸過程
- (void)C25_SPI_WR_Byte(C25_RW_READ_BURST | addr); // 寫入寄存器地址及讀寫控制(多字節(jié))
- for(j=0; j<num; j++)
- {
- p[j]=C25_SPI_WR_Byte(0); // 讀取寄存器數(shù)值
- }
- C25_Pin_CSn(1); // CSn置高,結(jié)束數(shù)據(jù)傳輸過程
- }
- // 函數(shù): C25_Power_ON_Reset()
- // 描述: CC2500芯片上電后的復(fù)位
- // 參數(shù): 無
- void C25_Power_ON_Reset(void)
- {
- long delay_num = 0;
- DDRB = 0X23; //輸入輸出方向
- PUCR_PUPBE = 0xff; //端口上拉
- PORTB = 0X00; //端口初始化
- C25_Pin_SCLK(0); // SCLK置低
- C25_Pin_SI(0); // SI置低
- C25_Pin_CSn(1); // CSN置高
- C25_Soft_Dly(1); // 延時
- C25_Pin_CSn(0); // CSn置低
- C25_Soft_Dly(1); // 延時
- C25_Pin_CSn(1); // CSn置高
- C25_Soft_Dly(50); // 保持CSn為高至少40uS
- C25_Pin_CSn(0); // CSn置低
- delay_num = 0;
- //等待時間過長強制跳出 以免卡死程序
- while(C25_Pin_SO==1 && delay_num<500000) delay_num++; // 等待SO置低(CHIP_RDYn)
- (void)C25_SPI_WR_Byte(C25_RW_WRITE_SINGLE | C25_CS_SRES); // 寫入芯片復(fù)位指令字
- delay_num = 0;
- //等待時間過長強制跳出 以免卡死程序
- while(C25_Pin_SO==1 && delay_num<500000) delay_num++; // 等待SO再置低,復(fù)位完成,此時芯片處于IDLE狀態(tài)
- C25_Pin_CSn(1); // CSn置高,結(jié)束復(fù)位過程
- }
- // 函數(shù): C25_Reg_Config()
- // 描述: CC2500寄存器設(shè)置
- // 工作頻率: 2400.0MHz (基頻:2400.0MHz, 通道:0, 通道間隔:200kHz)
- // 調(diào)制模式: GFSK
- // 數(shù)據(jù)速率: 2.4kbps
- // 發(fā)射功率: +1dBm
- // 數(shù)據(jù)包 : 固定長度
- // CRC校驗 : 開啟
- // 數(shù)據(jù)白化: 開啟
- // 曼切斯特: 關(guān)閉
- // FEC : 關(guān)閉
- void C25_Reg_Config(void)
- {
- (void)C25_SPI_W_Reg_Single(C25_RA_IOCFG2, C25_CR_IOCFGx_INV_DI // GDO2:不反轉(zhuǎn)輸出電平
- | C25_CR_IOCFGx_SYNC_WORD); // GDO2:發(fā)送/接收到同步字時置位,并在數(shù)據(jù)包的末尾取消置位
- (void)C25_SPI_W_Reg_Single(C25_RA_IOCFG0, C25_CR_IOCFG0_TEMP_SENS_DI // GDO0:禁用模擬溫度傳感器
- | C25_CR_IOCFGx_INV_DI // GDO0:不反轉(zhuǎn)輸出電平
- | C25_CR_IOCFGx_ABOVE_RX_FIFO_THR_END); // GDO0:達到或超出RX_FIFO閾值 填充RX_FIFO時置位,或到達數(shù)據(jù)包結(jié)尾時置位.
- (void)C25_SPI_W_Reg_Single(C25_RA_FIFOTHR, C25_CR_FIFOTHR_TX_1_RX_64); // 設(shè)置TX_FIFO和RX_FIFO閥值(TX:1,RX:64)
- (void)C25_SPI_W_Reg_Single(C25_RA_SYNC1, C25_CR_SYNC1); // 同步字高位(默認(rèn)0xD3=11010011)
- (void)C25_SPI_W_Reg_Single(C25_RA_SYNC0, C25_CR_SYNC0); // 同步字低位
- (void)C25_SPI_W_Reg_Single(C25_RA_PKTLEN, C25_Buff_Len); // 固定長度數(shù)據(jù)包時為數(shù)據(jù)包長度;可變長度數(shù)據(jù)包時為允許的最大數(shù)據(jù)包長度
- (void)C25_SPI_W_Reg_Single(C25_RA_PKTCTRL1, C25_CR_PKTCTRL1_PQT // 前導(dǎo)質(zhì)量評估門限(默認(rèn)值0)(等于0時同步字總能被接收)
- | C25_CR_PKTCTRL1_CRC_AUTOFLUSH_EN // 當(dāng)接收數(shù)據(jù)CRC校驗失敗時,自動清空RX_FIFO
- | C25_CR_PKTCTRL1_APPEND_STATUS_EN // 在有效負(fù)載上添加狀態(tài)字
- | C25_CR_PKTCTRL1_ADR_CHK_DI); // 不檢查地址
- (void)C25_SPI_W_Reg_Single(C25_RA_PKTCTRL0, C25_CR_PKTCTRL0_WHITE_DATA_EN // 開啟數(shù)據(jù)白化
- | C25_CR_PKTCTRL0_NORMAL_MODE // 普通模式,使用FIFO
- | C25_CR_PKTCTRL0_CRC_EN // 開啟CRC校驗
- | C25_CR_PKTCTRL0_PTKLEN_FIXED); // 固定數(shù)據(jù)包長度模式,在PKTLEN寄存器中配置長度數(shù)據(jù)
- (void)C25_SPI_W_Reg_Single(C25_RA_ADDR, C25_CR_ADDR); // 數(shù)據(jù)包過濾時使用的地址.可選廣播地址為0x00和0xFF
- (void)C25_SPI_W_Reg_Single(C25_RA_FSCTRL1, C25_CR_FSCTRL1_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_FSCTRL0, C25_CR_FSCTRL0); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_FREQ2, C25_CR_FREQ2_2400MHz); // 基頻為2400MHz時的FREQ2寄存器值
- (void)C25_SPI_W_Reg_Single(C25_RA_FREQ1, C25_CR_FREQ1_2400MHz); // 基頻為2400MHz時的FREQ1寄存器值
- (void)C25_SPI_W_Reg_Single(C25_RA_FREQ0, C25_CR_FREQ0_2400MHz); // 基頻為2400MHz時的FREQ0寄存器值
- (void)C25_SPI_W_Reg_Single(C25_RA_MDMCFG4, C25_CR_MDMCFG4_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_MDMCFG3, C25_CR_MDMCFG3_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_MDMCFG2, C25_CR_MDMCFG2_DEM_DCFILT_OFF_EN // 在解調(diào)前禁用數(shù)字DC阻斷濾波器,使能(更佳的靈敏度)
- | C25_CR_MDMCFG2_MOD_FORMAT_2FSK // 2FSK
- | C25_CR_MDMCFG2_MANCHESTER_DI // 禁用曼切斯特編碼/解碼
- | C25_CR_MDMCFG2_30_32_B_SYNC); // 檢測30/32同步字bit
- (void)C25_SPI_W_Reg_Single(C25_RA_MDMCFG1, C25_CR_MDMCFG1_FEC_DI // 禁用交錯向前糾錯
- | C25_CR_MDMCFG1_NUM_PREAMBLE_4BYTE // 最小前導(dǎo)4Byte
- | C25_CR_MDMCFG1_CHANSPC_E); // 通道間隔的2bit指數(shù)
- (void)C25_SPI_W_Reg_Single(C25_RA_MDMCFG0, C25_CR_MDMCFG0_CHANSPC_M); // 通道間隔的8bit尾數(shù)
- (void)C25_SPI_W_Reg_Single(C25_RA_DEVIANT, C25_CR_DEVIANT_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_MCSM2, C25_CR_MCSM2_RX_TIME_RSSI_DI // 不使用RSSI測量執(zhí)行RX終止
- | C25_CR_MCSM2_RX_TIME_QUAL_SYNC // 在RX_TIME定時器超時時,芯片檢查是否找到同步字
- | C25_CR_MCSM2_RX_TIME); // 在WOR模式和標(biāo)準(zhǔn)RX運行時,RX中的同步字搜索時限
- (void)C25_SPI_W_Reg_Single(C25_RA_MCSM1, C25_CR_MCSM1_CCA_MODE_RB_UCRPKT // 如果RSSI在閥值之下且除當(dāng)前接收數(shù)據(jù)包外,清空通道指示
- | C25_CR_MCSM1_RXOFF_MODE_RX // 數(shù)據(jù)包接收完成后保持RX狀態(tài)
- | C25_CR_MCSM1_TXOFF_MODE_RX); // 數(shù)據(jù)包發(fā)送完成后進入RX狀態(tài)
- (void)C25_SPI_W_Reg_Single(C25_RA_MCSM0, C25_CR_MCSM0_FS_AUTOCAL_IDLE_RTX // 從IDLE轉(zhuǎn)到RX,TX,FSTXON時進行自動校準(zhǔn)
- | C25_CR_MCSM0_PO_TIMEOUT_EC_64 // 終止計數(shù)次數(shù)64
- | C25_CR_MCSM0_PIN_CTRL_DI // 禁用由引腳直接進行的無線狀態(tài)控制
- | C25_CR_MCSM0_XOSC_FORCE_ON_DI); // XOSC在SLEEP狀態(tài)下關(guān)閉
- (void)C25_SPI_W_Reg_Single(C25_RA_FOCCFG, C25_CR_FOCCFG_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_BSCFG, C25_CR_BSCFG_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_AGCCTRL2, C25_CR_AGCCTRL2_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_AGCCTRL1, C25_CR_AGCCTRL1_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_AGCCTRL0, C25_CR_AGCCTRL0_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_WOREVT1, C25_CR_WOREVT1_EVENT0_HBYTE); // 事件0超時時間高位
- (void)C25_SPI_W_Reg_Single(C25_RA_WOREVT0, C25_CR_WOREVT0_EVENT0_LBYTE); // 事件0超時時間低位
- (void)C25_SPI_W_Reg_Single(C25_RA_WORCTRL, C25_CR_WORCTRL_RC_PD_EN // 向RC振蕩器發(fā)送掉電信號
- | C25_CR_WORCTRL_EVENT1_48 // 約1.333~1.385ms
- | C25_CR_WORCTRL_RC_CAL_EN // 開啟RC振蕩器校準(zhǔn)
- | C25_CR_WORCTRL_WOR_RES_1P); // 精度1周期,最大時限1.8~1.9秒
- (void)C25_SPI_W_Reg_Single(C25_RA_FREND1, C25_CR_FREND1_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_FREND0, C25_CR_FREND0_LODIV_BUF_CURRENT_TX// 調(diào)節(jié)當(dāng)前TX LO緩沖器(PA的輸入)
- | C25_CR_FREND0_PA_POWER_0); // 選擇PA功率設(shè)置
- (void)C25_SPI_W_Reg_Single(C25_RA_FSCAL3, C25_CR_FSCAL3_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_FSCAL2, C25_CR_FSCAL2); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_FSCAL1, C25_CR_FSCAL1_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_FSCAL0, C25_CR_FSCAL0_500KBPS); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_RCCTRL1, C25_CR_RCCTRL1); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_RCCTRL0, C25_CR_RCCTRL0); // 建議使用SmartRF Studio進行計算
- (void)C25_SPI_W_Reg_Single(C25_RA_PATABLE, C25_PS_PATABLE_1dBm); // 寫入PATABLE(+1.5dBm,21.4mA)
- C25_SPI_W_Cmd_Strobes(C25_CS_SRX); // 開啟RX
- }
- // 函數(shù): C25_Send_Packet()
- // 描述: 通過CC2500發(fā)送數(shù)據(jù)包,發(fā)送完成后返回接收狀態(tài)
- // 參數(shù): *p 待發(fā)送數(shù)據(jù)的首地址
- void C25_Send_Packet(byte *p)
- {
- Cpu_DisableInt();
- if(!flag_send_ok)//檢測是否正在發(fā)送 //中斷使用
- {
- C25_SPI_W_Cmd_Strobes(C25_CS_SIDLE); // 進入IDLE空閑模式
- C25_SPI_W_Cmd_Strobes(C25_CS_SFTX); // 清空TX_FIFO
- C25_SPI_W_Reg_Burst(C25_RA_TXFIFO, C25_Buff_Len, p); // 將數(shù)據(jù)寫入TX_FIFO寄存器
- C25_SPI_W_Cmd_Strobes(C25_CS_STX); // 開啟TX
- //flag_send_ok = 1; // 數(shù)據(jù)發(fā)射準(zhǔn)備就緒標(biāo)志位
- //while(C25_Pin_GDO2 == 0); // 等待發(fā)送結(jié)束 //中斷觸發(fā)時注釋這兩句
- //while(C25_Pin_GDO2 == 1); // 等待發(fā)送結(jié)束 //中斷觸發(fā)時注釋這兩句
- }
- Cpu_EnableInt();
- }
- // 函數(shù): C25_Rece_Packet()
- // 描述: 檢查CC2500是否接收到數(shù)據(jù);有接收時將數(shù)據(jù)返回至接收緩存區(qū)
- // 參數(shù): *p 接收數(shù)據(jù)存放地址
- // return 接收成功標(biāo)志,為1時表明數(shù)據(jù)接收成功
- byte C25_Rece_Packet(byte *p)
- {
- if(C25_Pin_GDO0==1) // 檢查接收數(shù)據(jù)包是否完成
- {
- C25_SPI_R_Reg_Burst(C25_RA_RXFIFO, C25_Buff_Len+2, p); // 讀取RX_FIFO及附加狀態(tài)字
- C25_SPI_W_Cmd_Strobes(C25_CS_SIDLE); // 進入IDLE空閑模式
- C25_SPI_W_Cmd_Strobes(C25_CS_SFRX); // 清空RX_FIFO
- C25_SPI_W_Cmd_Strobes(C25_CS_SRX); // 重新開啟RX
- return 1;
- }
- return 0; // 返回接收失敗標(biāo)志
- }
- // 函數(shù): C25_Get_RX_dBm()
- // 描述: 在完成數(shù)據(jù)接收后,獲取接收功率
- // 參數(shù): rssi 接收信號強度指示
- // return 接收功率
- char C25_Get_RX_dBm(byte rssi)
- {
- char t=rssi;
- if(rssi>=128){t-=255;} // 取絕對值
- return(t/2-71); // 計算RSSI值
- }
復(fù)制代碼
|
|