NRF24L01+在K60单片机中的具体实现
/*********************************标准的SPI协议写入读出(C51)
NRF24L01+
注意!!! : K60 要识别第几数据位时必须移置最低位 例如 sba&0x40要写成(sba&0x40) >>6
修改人:pg
最后修改时间:2016.5.12
**********************************************/
//#include "derivative.h"
#include "24L01.h"
#include "gpio.h"
#include "delay.h"
//#include "main.h"typedef unsigned char uchar;
typedef unsigned char uint;#define CE PTE0_O #define CSN PTE1_O#define SCK PTE2_O#define MOSI PTE3_O#define MISO PTE4_I#define IRQ PTE5_O #define key1 PTC0_I
#define led PTA15_O/*
#define keydown PTC1_I
#define keyok PTC2_I
#define keyleft PTC3_I
#define keyright PTC4_I */#define RX_DR ((sta&0x40) >>6) /**坑爹坑爹K60必须移到最低位才能识别**/
#define TX_DS ((sta&0x20) >>5)
#define MAX_RT ((sta&0x10) >>4)//==========================NRF24L01============================================
#define TX_ADR_WIDTH 5 // 5 uints TX address width
#define RX_ADR_WIDTH 5 // 5 uints RX address width
#define TX_PLOAD_WIDTH 32 // 32 TX payload
#define RX_PLOAD_WIDTH 32 // 32 uints TX payload
//=========================NRF24L01寄存器指令===================================
#define READ_REG 0x00 // 读寄存器指令
#define WRITE_REG 0x20 // 写寄存器指令
#define RD_RX_PLOAD 0x61 // 读取接收数据指令
#define WR_TX_PLOAD 0xA0 // 写待发数据指令
#define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令
#define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令
#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令
#define NOP 0xFF // 保留
//========================SPI(nRF24L01)寄存器地址===============================
#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01 // 自动应答功能设置
#define EN_RXADDR 0x02 // 可用信道设置
#define SETUP_AW 0x03 // 收发地址宽度设置
#define SETUP_RETR 0x04 // 自动重发功能设置
#define RF_CH 0x05 // 工作频率设置
#define RF_SETUP 0x06 // 发射速率、功耗功能设置
#define STATUS 0x07 // 状态寄存器
#define OBSERVE_TX 0x08 // 发送监测功能
#define CD 0x09 // 地址检测
#define RX_ADDR_P0 0x0A // 频道0接收数据地址
#define RX_ADDR_P1 0x0B // 频道1接收数据地址
#define RX_ADDR_P2 0x0C // 频道2接收数据地址
#define RX_ADDR_P3 0x0D // 频道3接收数据地址
#define RX_ADDR_P4 0x0E // 频道4接收数据地址
#define RX_ADDR_P5 0x0F // 频道5接收数据地址
#define TX_ADDR 0x10 // 发送地址寄存器
#define RX_PW_P0 0x11 // 接收频道0接收数据长度
#define RX_PW_P1 0x12 // 接收频道0接收数据长度
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
#define RX_PW_P5 0x16 // 接收频道0接收数据长度
#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
//=============================RF24l01状态=====================================unsigned char TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//本地地址
unsigned char RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//接收地址
unsigned char sta;
char tf, RxBuf[32],TxBuf[32];
/*
void inerDelay_us(unsigned char n);
void init_NRF24L01(void);//Error[Pe147]: declaration is incompatible with "__interwork __softfp char SPI_RW_Reg(char, char)" (declared at line 81) G:\桌面\电赛\15年电赛\旋转倒立摆\k60旋转倒立摆程序\7-31液晶屏加NRF\src\Sources\C\Component_C\OLED.c 86
//原因:需要最前面定义此函数
void SetRX_Mode(void);
uint SPI_RW(uint ucharss);
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
uint SPI_RW_Reg(uchar reg, uchar value);
uchar SPI_Read(uchar reg);
//uchar Check_Ack();
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); */
/*******************************************************************************************/
/*延时函数*/
/******************************************************************************************/
void inerDelay_us(unsigned char n)
{
for(;n>0;n--){asm("nop");}}
//****************************************************************************************
/*NRF24L01初始化 */
/***************************************************************************************/
void init_NRF24L01(void)
{inerDelay_us(100);CE=0; // chip enableCSN=1; // Spi disable SCK=0; // Spi clock line init high
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB
}
/****************************************************************************************************函数:uint SPI_RW(uint uchar) 功能:NRF24L01的SPI写时序
***************************************************************************************************/
uint SPI_RW(uint ucharss)
{
uint bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit{ // MOSI = (uchar & 0x80); k60识别不了!,STC12却可以!坑爹MOSI = (ucharss & 0x80)>>7; // output 'uchar', MSB to MOSI
ucharss = (ucharss << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
ucharss |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again}return(ucharss); // return read uchar
}
/****************************************************************************************************
函数:uchar SPI_Read(uchar reg)
功能:NRF24L01的SPI时序
****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;CSN = 0; // CSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communicationreturn(reg_val); // return register value
}
/****************************************************************************************************/
/*功能:NRF24L01读写寄存器函数
****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
uint status;CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high againreturn(status); // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
****************************************************************************************************/
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); // CSN = 1; return(status); // return nRF24L01 status uchar
}
/*********************************************************************************************************
函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
*********************************************************************************************************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;CSN = 0; //SPI使能
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
SPI_RW(*pBuf++);
CSN = 1; //关闭SPI
return(status); //
}
/****************************************************************************************************/
/*函数:void SetRX_Mode(void)功能:数据接收配置
****************************************************************************************************/
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
CE = 1;
inerDelay_us(130);
}
void SetTX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC ,主发送
CE = 1;
inerDelay_us(130);
}
/******************************************************************************************************/
/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
功能:数据读取后放如rx_buf接收缓冲区中
******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{unsigned char revale=0;
sta=SPI_Read(STATUS);// 读取状态寄存其来判断数据接收状况
if(RX_DR) // 判断是否接收到数据
{CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
return revale;
}
/***********************************************************************************************************
函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
功能:发送 tx_buf中数据
**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0; //StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);// 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送
CE=1; //置高CE,激发数据发送
inerDelay_us(10);
}
//************************************主函数************************************************************uchar Check_Ack()//他会自动重发
{
//while(IRQ);
sta = SPI_RW(NOP); // 返回状态寄存器
if(MAX_RT)// 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
SPI_RW(FLUSH_TX);
SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志
IRQ = 1;
if(TX_DS)
return(0x00);
else
return(0xff);}
以上为C文件,来源于网络的C51标准函数,注意事项已在注释中表明
以下为H文件
#ifndef _24L01_H
#define _24L01_H
#include "common.h"extern void inerDelay_us(unsigned char n);
extern void init_NRF24L01(void);//Error[Pe147]: declaration is incompatible with "__interwork __softfp char SPI_RW_Reg(char, char)" (declared at line 81) G:\桌面\电赛\15年电赛\旋转倒立摆\k60旋转倒立摆程序\7-31液晶屏加NRF\src\Sources\C\Component_C\OLED.c 86
//原因:需要最前面定义此函数
extern void SetRX_Mode(void);
extern void SetTX_Mode(void);
extern uint8 SPI_RW(uint8 ucharss);
extern unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
extern void nRF24L01_TxPacket(unsigned char * tx_buf);
extern uint8 SPI_RW_Reg(uint8 reg, uint8 value);
extern uint8 SPI_Read(uint8 reg);
extern uint8 Check_Ack();
extern uint8 SPI_Write_Buf(uint8 reg, uint8 *pBuf, uint8 uchars);
extern uint8 SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 uchars);//GPIO位带操作宏定义
//Pin方向控制
#define DDR(x, n) BITBAND_REG(x->PDDR, n)
#define DDRAn(n) DDR(PTA, n)
#define DDRBn(n) DDR(PTB, n)
#define DDRCn(n) DDR(PTC, n)
#define DDRDn(n) DDR(PTD, n)
#define DDREn(n) DDR(PTE, n)
#define DDRA0 DDRAn(0) //PortA方向控制
#define DDRA1 DDRAn(1)
#define DDRA2 DDRAn(2)
#define DDRA3 DDRAn(3)
#define DDRA4 DDRAn(4)
#define DDRA5 DDRAn(5)
#define DDRA6 DDRAn(6)
#define DDRA7 DDRAn(7)
#define DDRA8 DDRAn(8)
#define DDRA9 DDRAn(9)
#define DDRA10 DDRAn(10)
#define DDRA11 DDRAn(11)
#define DDRA12 DDRAn(12)
#define DDRA13 DDRAn(13)
#define DDRA14 DDRAn(14)
#define DDRA15 DDRAn(15)
#define DDRA16 DDRAn(16)
#define DDRA17 DDRAn(17)
#define DDRA18 DDRAn(18)
#define DDRA19 DDRAn(19)
#define DDRA24 DDRAn(24)
#define DDRA25 DDRAn(25)
#define DDRA26 DDRAn(26)
#define DDRA27 DDRAn(27)
#define DDRA28 DDRAn(28)
#define DDRA29 DDRAn(29)
#define DDRB0 DDRBn(0) //PortB方向控制
#define DDRB1 DDRBn(1)
#define DDRB2 DDRBn(2)
#define DDRB3 DDRBn(3)
#define DDRB4 DDRBn(4)
#define DDRB5 DDRBn(5)
#define DDRB6 DDRBn(6)
#define DDRB7 DDRBn(7)
#define DDRB8 DDRBn(8)
#define DDRB9 DDRBn(9)
#define DDRB10 DDRBn(10)
#define DDRB11 DDRBn(11)
#define DDRB16 DDRBn(16)
#define DDRB17 DDRBn(17)
#define DDRB18 DDRBn(18)
#define DDRB19 DDRBn(19)
#define DDRB20 DDRBn(20)
#define DDRB21 DDRBn(21)
#define DDRB22 DDRBn(22)
#define DDRB23 DDRBn(23)
#define DDRC0 DDRCn(0) //PortC方向控制
#define DDRC1 DDRCn(1)
#define DDRC2 DDRCn(2)
#define DDRC3 DDRCn(3)
#define DDRC4 DDRCn(4)
#define DDRC5 DDRCn(5)
#define DDRC6 DDRCn(6)
#define DDRC7 DDRCn(7)
#define DDRC8 DDRCn(8)
#define DDRC9 DDRCn(9)
#define DDRC10 DDRCn(10)
#define DDRC11 DDRCn(11)
#define DDRC12 DDRCn(12)
#define DDRC13 DDRCn(13)
#define DDRC14 DDRCn(14)
#define DDRC15 DDRCn(15)
#define DDRC16 DDRCn(16)
#define DDRC17 DDRCn(17)
#define DDRC18 DDRCn(18)
#define DDRC19 DDRCn(19)
#define DDRD0 DDRDn(0) //PortD方向控制
#define DDRD1 DDRDn(1)
#define DDRD2 DDRDn(2)
#define DDRD3 DDRDn(3)
#define DDRD4 DDRDn(4)
#define DDRD5 DDRDn(5)
#define DDRD6 DDRDn(6)
#define DDRD7 DDRDn(7)
#define DDRD8 DDRDn(8)
#define DDRD9 DDRDn(9)
#define DDRD10 DDRDn(10)
#define DDRD11 DDRDn(11)
#define DDRD12 DDRDn(12)
#define DDRD13 DDRDn(13)
#define DDRD14 DDRDn(14)
#define DDRD15 DDRDn(15)
#define DDRE0 DDREn(0) //PortE方向控制
#define DDRE1 DDREn(1)
#define DDRE2 DDREn(2)
#define DDRE3 DDREn(3)
#define DDRE4 DDREn(4)
#define DDRE5 DDREn(5)
#define DDRE6 DDREn(6)
#define DDRE7 DDREn(7)
#define DDRE8 DDREn(8)
#define DDRE9 DDREn(9)
#define DDRE10 DDREn(10)
#define DDRE11 DDREn(11)
#define DDRE12 DDREn(12)
#define DDRE24 DDREn(24)
#define DDRE25 DDREn(25)
#define DDRE26 DDREn(26)
#define DDRE27 DDREn(27)
#define DDRE28 DDREn(28)#define PTxn_O(x, n) BITBAND_REG(x->PDOR, n)
#define PTAn_O(n) PTxn_O(PTA, n)
#define PTBn_O(n) PTxn_O(PTB, n)
#define PTCn_O(n) PTxn_O(PTC, n)
#define PTDn_O(n) PTxn_O(PTD, n)
#define PTEn_O(n) PTxn_O(PTE, n)
#define PTA0_O PTAn_O(0) //PortA输出
#define PTA1_O PTAn_O(1)
#define PTA2_O PTAn_O(2)
#define PTA3_O PTAn_O(3)
#define PTA4_O PTAn_O(4)
#define PTA5_O PTAn_O(5)
#define PTA6_O PTAn_O(6)
#define PTA7_O PTAn_O(7)
#define PTA8_O PTAn_O(8)
#define PTA9_O PTAn_O(9)
#define PTA10_O PTAn_O(10)
#define PTA11_O PTAn_O(11)
#define PTA12_O PTAn_O(12)
#define PTA13_O PTAn_O(13)
#define PTA14_O PTAn_O(14)
#define PTA15_O PTAn_O(15)
#define PTA16_O PTAn_O(16)
#define PTA17_O PTAn_O(17)
#define PTA18_O PTAn_O(18)
#define PTA19_O PTAn_O(19)
#define PTA24_O PTAn_O(24)
#define PTA25_O PTAn_O(25)
#define PTA26_O PTAn_O(26)
#define PTA27_O PTAn_O(27)
#define PTA28_O PTAn_O(28)
#define PTA29_O PTAn_O(29)
#define PTB0_O PTBn_O(0) //PortB输出
#define PTB1_O PTBn_O(1)
#define PTB2_O PTBn_O(2)
#define PTB3_O PTBn_O(3)
#define PTB4_O PTBn_O(4)
#define PTB5_O PTBn_O(5)
#define PTB6_O PTBn_O(6)
#define PTB7_O PTBn_O(7)
#define PTB8_O PTBn_O(8)
#define PTB9_O PTBn_O(9)
#define PTB10_O PTBn_O(10)
#define PTB11_O PTBn_O(11)
#define PTB16_O PTBn_O(16)
#define PTB17_O PTBn_O(17)
#define PTB18_O PTBn_O(18)
#define PTB19_O PTBn_O(19)
#define PTB20_O PTBn_O(20)
#define PTB21_O PTBn_O(21)
#define PTB22_O PTBn_O(22)
#define PTB23_O PTBn_O(23)
#define PTC0_O PTCn_O(0) //PortC输出
#define PTC1_O PTCn_O(1)
#define PTC2_O PTCn_O(2)
#define PTC3_O PTCn_O(3)
#define PTC4_O PTCn_O(4)
#define PTC5_O PTCn_O(5)
#define PTC6_O PTCn_O(6)
#define PTC7_O PTCn_O(7)
#define PTC8_O PTCn_O(8)
#define PTC9_O PTCn_O(9)
#define PTC10_O PTCn_O(10)
#define PTC11_O PTCn_O(11)
#define PTC12_O PTCn_O(12)
#define PTC13_O PTCn_O(13)
#define PTC14_O PTCn_O(14)
#define PTC15_O PTCn_O(15)
#define PTC16_O PTCn_O(16)
#define PTC17_O PTCn_O(17)
#define PTC18_O PTCn_O(18)
#define PTC19_O PTCn_O(19)
#define PTD0_O PTDn_O(0) //PortD输出
#define PTD1_O PTDn_O(1)
#define PTD2_O PTDn_O(2)
#define PTD3_O PTDn_O(3)
#define PTD4_O PTDn_O(4)
#define PTD5_O PTDn_O(5)
#define PTD6_O PTDn_O(6)
#define PTD7_O PTDn_O(7)
#define PTD8_O PTDn_O(8)
#define PTD9_O PTDn_O(9)
#define PTD10_O PTDn_O(10)
#define PTD11_O PTDn_O(11)
#define PTD12_O PTDn_O(12)
#define PTD13_O PTDn_O(13)
#define PTD14_O PTDn_O(14)
#define PTD15_O PTDn_O(15)
#define PTE0_O PTEn_O(0) //PortE输出
#define PTE1_O PTEn_O(1)
#define PTE2_O PTEn_O(2)
#define PTE3_O PTEn_O(3)
#define PTE4_O PTEn_O(4)
#define PTE5_O PTEn_O(5)
#define PTE6_O PTEn_O(6)
#define PTE7_O PTEn_O(7)
#define PTE8_O PTEn_O(8)
#define PTE9_O PTEn_O(9)
#define PTE10_O PTEn_O(10)
#define PTE11_O PTEn_O(11)
#define PTE12_O PTEn_O(12)
#define PTE24_O PTEn_O(24)
#define PTE25_O PTEn_O(25)
#define PTE26_O PTEn_O(26)
#define PTE27_O PTEn_O(27)
#define PTE28_O PTEn_O(28)
//Pin输入
#define PTxn_I(x, n) BITBAND_REG(x->PDIR, n)
#define PTAn_I(n) PTxn_I(PTA, n)
#define PTBn_I(n) PTxn_I(PTB, n)
#define PTCn_I(n) PTxn_I(PTC, n)
#define PTDn_I(n) PTxn_I(PTD, n)
#define PTEn_I(n) PTxn_I(PTE, n)
#define PTA0_I PTAn_I(0) //PortA输入
#define PTA1_I PTAn_I(1)
#define PTA2_I PTAn_I(2)
#define PTA3_I PTAn_I(3)
#define PTA4_I PTAn_I(4)
#define PTA5_I PTAn_I(5)
#define PTA6_I PTAn_I(6)
#define PTA7_I PTAn_I(7)
#define PTA8_I PTAn_I(8)
#define PTA9_I PTAn_I(9)
#define PTA10_I PTAn_I(10)
#define PTA11_I PTAn_I(11)
#define PTA12_I PTAn_I(12)
#define PTA13_I PTAn_I(13)
#define PTA14_I PTAn_I(14)
#define PTA15_I PTAn_I(15)
#define PTA16_I PTAn_I(16)
#define PTA17_I PTAn_I(17)
#define PTA18_I PTAn_I(18)
#define PTA19_I PTAn_I(19)
#define PTA24_I PTAn_I(24)
#define PTA25_I PTAn_I(25)
#define PTA26_I PTAn_I(26)
#define PTA27_I PTAn_I(27)
#define PTA28_I PTAn_I(28)
#define PTA29_I PTAn_I(29)
#define PTB0_I PTBn_I(0) //PortB输入
#define PTB1_I PTBn_I(1)
#define PTB2_I PTBn_I(2)
#define PTB3_I PTBn_I(3)
#define PTB4_I PTBn_I(4)
#define PTB5_I PTBn_I(5)
#define PTB6_I PTBn_I(6)
#define PTB7_I PTBn_I(7)
#define PTB8_I PTBn_I(8)
#define PTB9_I PTBn_I(9)
#define PTB10_I PTBn_I(10)
#define PTB11_I PTBn_I(11)
#define PTB16_I PTBn_I(16)
#define PTB17_I PTBn_I(17)
#define PTB18_I PTBn_I(18)
#define PTB19_I PTBn_I(19)
#define PTB20_I PTBn_I(20)
#define PTB21_I PTBn_I(21)
#define PTB22_I PTBn_I(22)
#define PTB23_I PTBn_I(23)
#define PTC0_I PTCn_I(0) //PortC输入
#define PTC1_I PTCn_I(1)
#define PTC2_I PTCn_I(2)
#define PTC3_I PTCn_I(3)
#define PTC4_I PTCn_I(4)
#define PTC5_I PTCn_I(5)
#define PTC6_I PTCn_I(6)
#define PTC7_I PTCn_I(7)
#define PTC8_I PTCn_I(8)
#define PTC9_I PTCn_I(9)
#define PTC10_I PTCn_I(10)
#define PTC11_I PTCn_I(11)
#define PTC12_I PTCn_I(12)
#define PTC13_I PTCn_I(13)
#define PTC14_I PTCn_I(14)
#define PTC15_I PTCn_I(15)
#define PTC16_I PTCn_I(16)
#define PTC17_I PTCn_I(17)
#define PTC18_I PTCn_I(18)
#define PTC19_I PTCn_I(19)
#define PTD0_I PTDn_I(0) //PortD输入
#define PTD1_I PTDn_I(1)
#define PTD2_I PTDn_I(2)
#define PTD3_I PTDn_I(3)
#define PTD4_I PTDn_I(4)
#define PTD5_I PTDn_I(5)
#define PTD6_I PTDn_I(6)
#define PTD7_I PTDn_I(7)
#define PTD8_I PTDn_I(8)
#define PTD9_I PTDn_I(9)
#define PTD10_I PTDn_I(10)
#define PTD11_I PTDn_I(11)
#define PTD12_I PTDn_I(12)
#define PTD13_I PTDn_I(13)
#define PTD14_I PTDn_I(14)
#define PTD15_I PTDn_I(15)
#define PTE0_I PTEn_I(0) //PortE输入
#define PTE1_I PTEn_I(1)
#define PTE2_I PTEn_I(2)
#define PTE3_I PTEn_I(3)
#define PTE4_I PTEn_I(4)
#define PTE5_I PTEn_I(5)
#define PTE6_I PTEn_I(6)
#define PTE7_I PTEn_I(7)
#define PTE8_I PTEn_I(8)
#define PTE9_I PTEn_I(9)
#define PTE10_I PTEn_I(10)
#define PTE11_I PTEn_I(11)
#define PTE12_I PTEn_I(12)
#define PTE24_I PTEn_I(24)
#define PTE25_I PTEn_I(25)
#define PTE26_I PTEn_I(26)
#define PTE27_I PTEn_I(27)
#define PTE28_I PTEn_I(28)/* GPIO - Peripheral instance base addresses */
/** Peripheral PTA base address */
#define PTA_BASE (0x400FF000u)
/** Peripheral PTA base pointer */
#define PTA ((GPIO_MemMapPtr)PTA_BASE)
/** Peripheral PTB base address */
#define PTB_BASE (0x400FF040u)
/** Peripheral PTB base pointer */
#define PTB ((GPIO_MemMapPtr)PTB_BASE)
/** Peripheral PTC base address */
#define PTC_BASE (0x400FF080u)
/** Peripheral PTC base pointer */
#define PTC ((GPIO_MemMapPtr)PTC_BASE)
/** Peripheral PTD base address */
#define PTD_BASE (0x400FF0C0u)
/** Peripheral PTD base pointer */
#define PTD ((GPIO_MemMapPtr)PTD_BASE)
/** Peripheral PTE base address */
#define PTE_BASE (0x400FF100u)
/** Peripheral PTE base pointer */
#define PTE ((GPIO_MemMapPtr)PTE_BASE)#endif
NRF24L01+在K60单片机中的具体实现相关推荐
- nRF24L01+基于51单片机的驱动(库)实战代码分享
nRF24L01+基于51单片机的驱动(库)实战代码分享 关于代码来源 定义数据类型的头文件Type.h nRF24L01+驱动源代码文件nRF24L01P.c nRF24L01+驱动的头文件nRF2 ...
- STM32单片机中WIFI模块数据传输问题(float->u32->u8/u8->u32->float)
STM32单片机中WIFI模块数据传输问题(float->u32->u8/u8->u32->float) 最近在做毕业设计,在做wifi数据传输与接收时,涉及到了STM32 ...
- STM32为何能在众多单片机中脱颖而出?
现在STM32资料教程如此丰富,但还是很多人学不会- 假如STM32像10年前的NXP单片机资料一样少,估计学不会的人会更多. 大家好,我是无际,一个踩坑单片机开发10年的老油条. 这些年,我用过很多 ...
- 单片机中存储器扩展位地址线怎么算_小白学单片机 :AT89S51单片机基本硬件结构认识(2)...
AT89S51单片机存储器的空间配置及功能结构 AT89S51单片机的存储器在物理结构上可以分为4个不同的存储空间:(1)内部程序存储器:(2)片内数据存储器:(3)片外数据存储器(最大可扩展到64K ...
- 单片机中的ROM,RAM和FLASH的作用
本文部分参考自:http://blog.sina.com.cn/s/blog_98ca54fc01017y4t.html 并在此基础上进行整理,添加了关于flash的问题. 之前从较为抽象的角度介绍了 ...
- 联合体在单片机中的应用
转自:http://baike.baidu.com/item/%E8%81%94%E5%90%88%E4%BD%93?fr=aladdin 联合体在单片机中的应用 单片机中经常会遇见分离高低字节的操作 ...
- 51单片机中的定时器
文章目录 1 51单片机中的定时器介绍 1.1 定时器的初步认识 1.2 定时器的寄存器 1.3 使用定时器的方法 1.4 定时时间的计算 2 定时器模式1 2.1 定时器模式1原理分析 2.2 使用 ...
- 单片机中灯泡显示miss_单片机实例分享,如何设计八路抢答器
单片机作为可编程器件,简化了电路的设计.方便了逻辑设计,从此再也不用使用一大堆电路做硬件逻辑了.拆开任何一件功能稍微复杂一点电子产品,里边都可以看到单片机的身影.学会单片机对找工作也很有利,而且待遇还 ...
- 单片机中如何将BCD码拆开_单片机二进制BCD码转换实验程序流程图
二进制BCD码转换 一.实验目的 1.掌握简单的数值转换算法 2.基本了解数值的各种表达方法 二.实验说明 单片机中的数值有各种表达方式,这是单片机的基础.掌握各种数制之间的转换是一种基本功.我们将给 ...
- html5控制单片机,10.2 单片机中 PWM 的原理与控制程序
PWM 在单片机中的应用是非常广泛的,它的基本原理很简单,但往往应用于不同场合上意义也不完全一样,这里我先把基本概念和基本原理给大家介绍一下,后边遇到用的时候起码知道是个什么东西. PWM 是 Pul ...
最新文章
- 嗯,挺全乎儿的,Spring Boot 多环境配置都在这儿了,你喜欢哪一种呢?
- java flex xml_FLEX与JAVA的交互问题 -DOM4J-xml
- Ice_cream's world I HDU - 2120(并查集判环)
- 将联网方式更改为桥接模式
- 浅述 Docker 的容器编排
- 谈区块链的时候别忘记了“新零售”
- signature=0727ee8cc38ba70036807ebbc0b018d6,NMSSM+
- oracle11g Rac Bond,Oracle11g搭建RAC步骤..doc
- JAVAweb之SSH框架
- python如何批量下载大文件(支持断点续传)
- 2022聚合工艺复训题库及在线模拟考试
- 网站监控服务都包括哪些具体内容?
- SNAP 4. 使用snap进行地物光谱分析
- HALF-GCD算法的阐述
- Android中使用SVG矢量图打造多边形图形框架
- Minecraft mod制作简易教程(三)——创建一个物品
- 外卖返利系统/美团/饿了么外卖CPS联盟返利公众号小程序核心源码
- Win10任务栏软件图标变成白色如何解决?
- linux 系统时间 硬件时间 及 时区设置
- 使用领英助理解决领英搜索限制继续精准搜索人脉(客户)的方法
热门文章
- 在线客服html前端代码QQ微信联系
- Python爬虫初探——天涯
- tampermonkey这玩意如何替换flash播放器为h5播放器?
- 百度语音识别API报错KeyError: ‘result‘
- Android混淆介绍
- 小米笔记本pro充电测试软件,小米笔记本 Pro 评测:高端已成,性价比不变
- matlab gui制作,MATLAB GUI制作教程
- 12个你值得拥有的虚拟科学实验APP、工具和资源
- C# Revit二次开发
- Python爬虫实战之爬取链家广州房价_02把小爬虫变大