cc2500的底層驅動 C程序 而且可移植:
0.png (60.18 KB, 下載次數: 156)
下載附件
2017-2-19 17:45 上傳
全部源碼下載:
Desktop.zip
(13.7 KB, 下載次數: 79)
2017-2-19 12:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
單片機主程序預覽:
- #include "CC2500.h" // CC2500無線數傳模塊驅動頭文件
- #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 // 數據輸入 (MCU output)
- #define C25_Pin_SO PORTB_PB2 // 數據輸出 (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};// 發送數據緩沖區
- byte C25_Rece_Buff[C25_Buff_Len]={0}; // 接收數據緩沖區
- byte flag_send_ok = 0; //發送完成標志位 0完成 1正在發送
- // 函數: C25_Soft_Dly()
- // 描述: 軟件延時 10us
- // 參數: 無
- 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默認頻率for(jj=0;jj<160;jj++);
- }
- // 函數: C25_SPI_WR_Byte()
- // 描述: 通過SPI寫一個byte到CC2500,同時從CC2500讀取一個Byte
- // 參數: byte 待寫入字節數據
- // return 讀取到的字節數據
- byte C25_SPI_WR_Byte(byte temp)
- {
- byte j;
- for(j=0; j<8; j++) // 循環8次
- {
- C25_Pin_SI((temp & 0x80)>>7); // 將byte最高位輸出到SI
- temp <<= 1; // 低一位移位到最高位
- C25_Pin_SCLK(1); // 拉高SLCK,CC2500從SI讀入1位數據,同時CC2500從SO輸出1位數據
- temp |= C25_Pin_SO; // 讀SO到byte最低位
- C25_Pin_SCLK(0); // SCLK置低
- }
- return(temp); // 返回讀取的1Byte數據
- }
- // 函數: C25_SPI_W_Cmd_Strobes()
- // 描述: 向芯片中寫入指令控制字
- // 參數: cmd 待寫入的指令控制字
- void C25_SPI_W_Cmd_Strobes(byte cmd)
- {
- C25_Pin_CSn(0); // CSn置低,開始數據傳輸過程
- (void)C25_SPI_WR_Byte(C25_RW_WRITE_SINGLE | cmd); // 寫入指令控制字
- C25_Pin_CSn(1); // CSn置高,結束數據傳輸過程
- }
- // 函數: C25_SPI_W_Reg_Single()
- // 描述: 向1個寄存器中寫入數據,同時讀取狀態字
- // 參數: addr 待寫入的寄存器地址
- // value 待寫入的字節數據
- // return 讀取到狀態字
- byte C25_SPI_W_Reg_Single(byte addr,byte value)
- {
- byte status;
- C25_Pin_CSn(0); // CSn置低,開始數據傳輸過程
- (void)C25_SPI_WR_Byte(C25_RW_WRITE_SINGLE | addr); // 寫入寄存器地址及讀寫控制
- status = C25_SPI_WR_Byte(value); // 寫入寄存器數值,并讀取狀態字
- C25_Pin_CSn(1); // CSn置高,結束數據傳輸過程
- return(status); // 返回狀態字
- }
- // 函數: C25_SPI_W_Reg_Burst()
- // 描述: 向寄存器中寫入多個數據
- // 參數: addr 待寫入的寄存器首地址
- // *p 待寫入的數據首地址
- // num 待寫入的數據長度
- void C25_SPI_W_Reg_Burst(byte addr,byte num,byte *p)
- {
- byte j;
- C25_Pin_CSn(0); // CSn置低,開始數據傳輸過程
- (void)C25_SPI_WR_Byte(C25_RW_WRITE_BURST | addr); // 寫入寄存器地址及讀寫控制(多字節)
- for(j=0; j<num; j++)
- {
- (void)C25_SPI_WR_Byte(p[j]); // 寫入寄存器數值
- }
- C25_Pin_CSn(1); // CSn置高,結束數據傳輸過程
- }
- // 函數: C25_SPI_R_Reg_Burst()
- // 描述: 從寄存器中讀取多個數據
- // 參數: addr 待讀取的寄存器首地址
- // *p 待讀取的寄存器數據存放首地址
- // num 待讀取的數據長度
- void C25_SPI_R_Reg_Burst(byte addr,byte num,byte *p)
- {
- byte j;
- C25_Pin_CSn(0); // CSn置低,開始數據傳輸過程
- (void)C25_SPI_WR_Byte(C25_RW_READ_BURST | addr); // 寫入寄存器地址及讀寫控制(多字節)
- for(j=0; j<num; j++)
- {
- p[j]=C25_SPI_WR_Byte(0); // 讀取寄存器數值
- }
- C25_Pin_CSn(1); // CSn置高,結束數據傳輸過程
- }
- // 函數: C25_Power_ON_Reset()
- // 描述: CC2500芯片上電后的復位
- // 參數: 無
- 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); // 寫入芯片復位指令字
- delay_num = 0;
- //等待時間過長強制跳出 以免卡死程序
- while(C25_Pin_SO==1 && delay_num<500000) delay_num++; // 等待SO再置低,復位完成,此時芯片處于IDLE狀態
- C25_Pin_CSn(1); // CSn置高,結束復位過程
- }
- // 函數: C25_Reg_Config()
- // 描述: CC2500寄存器設置
- // 工作頻率: 2400.0MHz (基頻:2400.0MHz, 通道:0, 通道間隔:200kHz)
- // 調制模式: GFSK
- // 數據速率: 2.4kbps
- // 發射功率: +1dBm
- // 數據包 : 固定長度
- // CRC校驗 : 開啟
- // 數據白化: 開啟
- // 曼切斯特: 關閉
- // FEC : 關閉
- void C25_Reg_Config(void)
- {
- (void)C25_SPI_W_Reg_Single(C25_RA_IOCFG2, C25_CR_IOCFGx_INV_DI // GDO2:不反轉輸出電平
- | C25_CR_IOCFGx_SYNC_WORD); // GDO2:發送/接收到同步字時置位,并在數據包的末尾取消置位
- (void)C25_SPI_W_Reg_Single(C25_RA_IOCFG0, C25_CR_IOCFG0_TEMP_SENS_DI // GDO0:禁用模擬溫度傳感器
- | C25_CR_IOCFGx_INV_DI // GDO0:不反轉輸出電平
- | C25_CR_IOCFGx_ABOVE_RX_FIFO_THR_END); // GDO0:達到或超出RX_FIFO閾值 填充RX_FIFO時置位,或到達數據包結尾時置位.
- (void)C25_SPI_W_Reg_Single(C25_RA_FIFOTHR, C25_CR_FIFOTHR_TX_1_RX_64); // 設置TX_FIFO和RX_FIFO閥值(TX:1,RX:64)
- (void)C25_SPI_W_Reg_Single(C25_RA_SYNC1, C25_CR_SYNC1); // 同步字高位(默認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); // 固定長度數據包時為數據包長度;可變長度數據包時為允許的最大數據包長度
- (void)C25_SPI_W_Reg_Single(C25_RA_PKTCTRL1, C25_CR_PKTCTRL1_PQT // 前導質量評估門限(默認值0)(等于0時同步字總能被接收)
- | C25_CR_PKTCTRL1_CRC_AUTOFLUSH_EN // 當接收數據CRC校驗失敗時,自動清空RX_FIFO
- | C25_CR_PKTCTRL1_APPEND_STATUS_EN // 在有效負載上添加狀態字
- | C25_CR_PKTCTRL1_ADR_CHK_DI); // 不檢查地址
- (void)C25_SPI_W_Reg_Single(C25_RA_PKTCTRL0, C25_CR_PKTCTRL0_WHITE_DATA_EN // 開啟數據白化
- | C25_CR_PKTCTRL0_NORMAL_MODE // 普通模式,使用FIFO
- | C25_CR_PKTCTRL0_CRC_EN // 開啟CRC校驗
- | C25_CR_PKTCTRL0_PTKLEN_FIXED); // 固定數據包長度模式,在PKTLEN寄存器中配置長度數據
- (void)C25_SPI_W_Reg_Single(C25_RA_ADDR, C25_CR_ADDR); // 數據包過濾時使用的地址.可選廣播地址為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 // 在解調前禁用數字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 // 最小前導4Byte
- | C25_CR_MDMCFG1_CHANSPC_E); // 通道間隔的2bit指數
- (void)C25_SPI_W_Reg_Single(C25_RA_MDMCFG0, C25_CR_MDMCFG0_CHANSPC_M); // 通道間隔的8bit尾數
- (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測量執行RX終止
- | C25_CR_MCSM2_RX_TIME_QUAL_SYNC // 在RX_TIME定時器超時時,芯片檢查是否找到同步字
- | C25_CR_MCSM2_RX_TIME); // 在WOR模式和標準RX運行時,RX中的同步字搜索時限
- (void)C25_SPI_W_Reg_Single(C25_RA_MCSM1, C25_CR_MCSM1_CCA_MODE_RB_UCRPKT // 如果RSSI在閥值之下且除當前接收數據包外,清空通道指示
- | C25_CR_MCSM1_RXOFF_MODE_RX // 數據包接收完成后保持RX狀態
- | C25_CR_MCSM1_TXOFF_MODE_RX); // 數據包發送完成后進入RX狀態
- (void)C25_SPI_W_Reg_Single(C25_RA_MCSM0, C25_CR_MCSM0_FS_AUTOCAL_IDLE_RTX // 從IDLE轉到RX,TX,FSTXON時進行自動校準
- | C25_CR_MCSM0_PO_TIMEOUT_EC_64 // 終止計數次數64
- | C25_CR_MCSM0_PIN_CTRL_DI // 禁用由引腳直接進行的無線狀態控制
- | C25_CR_MCSM0_XOSC_FORCE_ON_DI); // XOSC在SLEEP狀態下關閉
- (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振蕩器發送掉電信號
- | C25_CR_WORCTRL_EVENT1_48 // 約1.333~1.385ms
- | C25_CR_WORCTRL_RC_CAL_EN // 開啟RC振蕩器校準
- | 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// 調節當前TX LO緩沖器(PA的輸入)
- | C25_CR_FREND0_PA_POWER_0); // 選擇PA功率設置
- (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
- }
- // 函數: C25_Send_Packet()
- // 描述: 通過CC2500發送數據包,發送完成后返回接收狀態
- // 參數: *p 待發送數據的首地址
- void C25_Send_Packet(byte *p)
- {
- Cpu_DisableInt();
- if(!flag_send_ok)//檢測是否正在發送 //中斷使用
- {
- 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); // 將數據寫入TX_FIFO寄存器
- C25_SPI_W_Cmd_Strobes(C25_CS_STX); // 開啟TX
- //flag_send_ok = 1; // 數據發射準備就緒標志位
- //while(C25_Pin_GDO2 == 0); // 等待發送結束 //中斷觸發時注釋這兩句
- //while(C25_Pin_GDO2 == 1); // 等待發送結束 //中斷觸發時注釋這兩句
- }
- Cpu_EnableInt();
- }
- // 函數: C25_Rece_Packet()
- // 描述: 檢查CC2500是否接收到數據;有接收時將數據返回至接收緩存區
- // 參數: *p 接收數據存放地址
- // return 接收成功標志,為1時表明數據接收成功
- byte C25_Rece_Packet(byte *p)
- {
- if(C25_Pin_GDO0==1) // 檢查接收數據包是否完成
- {
- C25_SPI_R_Reg_Burst(C25_RA_RXFIFO, C25_Buff_Len+2, p); // 讀取RX_FIFO及附加狀態字
- 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; // 返回接收失敗標志
- }
- // 函數: C25_Get_RX_dBm()
- // 描述: 在完成數據接收后,獲取接收功率
- // 參數: rssi 接收信號強度指示
- // return 接收功率
- char C25_Get_RX_dBm(byte rssi)
- {
- char t=rssi;
- if(rssi>=128){t-=255;} // 取絕對值
- return(t/2-71); // 計算RSSI值
- }
復制代碼
|