NRF24L01驅動程式
阿新 • • 發佈:2019-02-11
******************************************************************************** * NRF24L01驅動模組 * * 文 件:NRF24L01.c * 函式及功能:1) * 2) * 作 者:XX * 日 期:2016年9月20日 ******************************************************************************** */ #include "include.h" sbit CSN = P0^0; sbit CE = P0^1; sbit MOSI = P0^2; sbit MISO = P0^3; sbit SCK = P0^3; unsigned char const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址 unsigned char const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址 /* ******************************************************************************** * 函式名稱:unsigned char SPI_RW(unsigned char byte) * * 功 能:寫時序 * * 呼叫清單:無 * * 參 數:byte * * 返 回 值:byte * * 注 意:1) * 2) ******************************************************************************** */ unsigned char SPI_RW(unsigned char byte) { unsigned char bit_ctr; for(bit_ctr = 0; bit_ctr < 8; bit_ctr++) { MOSI = (0x80 & byte); byte <<= 1; SCK = 1; byte |= MISO; SCK = 0; } return (byte); } /* ******************************************************************************** * 函式名稱:unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value) * * 功 能:設定暫存器的值 * * 呼叫清單:1)unsigned char SPI_RW(unsigned char byte) * * 參 數:reg, value * * 返 回 值:status * * 注 意:1) * 2) ******************************************************************************** */ unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value) { unsigned char status; CSN = 0; status = SPI_RW(reg); SPI_RW(value); CSN = 1; return (status); } /* ******************************************************************************** * 函式名稱:unsigned char SPI_Read(unsigned char reg) * * 功 能:讀取暫存器中的值 * * 呼叫清單:1)unsigned char SPI_RW(unsigned char byte) * * 參 數:reg * * 返 回 值:reg_val * * 注 意:1) * 2) ******************************************************************************** */ unsigned char SPI_Read(unsigned char reg) { unsigned char reg_val; CSN = 0; SPI_RW(reg); reg_val = SPI_RW(0); CSN = 1; return (reg_val); } /* ******************************************************************************** * 函式名稱:unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes) * * 功 能:在接收時讀取FIFO緩衝區中的值 * * 呼叫清單:1)unsigned char SPI_RW(unsigned char byte) * * 參 數:reg, *pBuf, bytes * * 返 回 值:status * * 注 意:1) * 2) ******************************************************************************** */ unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes) { unsigned char status; unsigned char byte_ctr; CSN = 0; status = SPI_RW(reg); for(byte_ctr = 0; byte_ctr < bytes; byte_ctr++) { pBuf[byte_ctr] = SPI_RW(0); } CSN = 1; return (status); } /* ******************************************************************************** * 函式名稱:unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes) * * 功 能: 把數組裡的數放到發射FIFO緩衝區中去 * * 呼叫清單:1)unsigned char SPI_RW(unsigned char byte) * * 參 數:reg, *pBuf, bytes * * 返 回 值:status * * 注 意:1) * 2) ******************************************************************************** */ unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes) { unsigned char status; unsigned char byte_ctr; CSN = 0; status = SPI_RW(reg); Delay_Us(10); for(byte_ctr = 0; byte_ctr < bytes; byte_ctr++) { SPI_RW(*pBuf++); } CSN = 1; return (status); } /* ******************************************************************************** * 函式名稱:void RX_Mode(void) * * 功 能:設定NRF24L01為接收方式 * * 呼叫清單:1)unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes) * 2)unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value) * 參 數:無 * * 返 回 值:無 * * 注 意:1) * 2) ******************************************************************************** */ void RX_Mode(void) { CE = 0; SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); SPI_RW_Reg(WRITE_REG + RF_CH, 40); SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); CE = 1; } /* ******************************************************************************** * 函式名稱:void TX_Mode(void) * * 功 能:設定NRF24L01為發射方式 * * 呼叫清單:1)unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes) * 2)unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value) * 參 數:無 * * 返 回 值:無 * * 注 意:1) * 2) ******************************************************************************** */ void TX_Mode(void) { CE = 0; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設定接收資料長度,本次設定為4位元組 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); SPI_RW_Reg(WRITE_REG + RF_CH, 40); SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); CE = 1; }