以前學AVR時候做的一些程序,分享一下
#include
#include
#include "lcd12864.h"
#define uint unsigned int
#define uchar unsigned char
#define MISO PINB.6
#define SCK PORTB.7
#define MOSI PORTB.5
#define CSN PORTC.0
#define CE PORTC.1
#define IRQ PORTC.2
#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 OBSTERVE_TX 0x08 //發送檢測寄存器
#define CD 0x09 //載波檢測
#define RX_ADDR_P0 0x0a //數據通道0接收地址
#define RX_ADDR_P1 0x0b //數據通道0接收地址
#define RX_ADDR_P2 0x0c //數據通道0接收地址
#define RX_ADDR_P3 0x0d //數據通道0接收地址
#define RX_ADDR_P4 0x0e //數據通道0接收地址
#define RX_ADDR_P5 0x0f //數據通道0接收地址
#define TX_ADDR 0x10 //發送地址
#define RX_PW_P0 0x11 //
#define RX_PW_P1 0x12 //
#define RX_PW_P2 0x13 //
#define RX_PW_P3 0x14 //
#define RX_PW_P4 0x15 //
#define RX_PW_P5 0x16 //
#define FIFO_STATUS 0x17 //FIFO狀態寄存器
#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 // 保留
#define TX_ADR_WIDTH 5 // 5 uints TX address width
#define RX_ADR_WIDTH 5 // 5 uints RX address width
#define TX_PLOAD_WIDTH 20 // 20 uints TX payload
#define RX_PLOAD_WIDTH 20 // 20 uints TX payload
uchar status;
uchar str[30];
uchar TX_ADDRESS[TX_ADR_WIDTH]= {0x05,0x04,0x03,0x02,0x01}; //本地地址
uchar RX_ADDRESS[RX_ADR_WIDTH]= {0x05,0x04,0x03,0x02,0x01}; //接收地址
uchar TxBuf[17]="anywhere you are";
uchar SPI_RW(uchar uuchar)//SPI寫時序
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI=(uuchar&0x80);
uuchar=(uuchar<<1);
SCK=1;
uuchar|=MISO;
SCK=0;
}
return (uuchar);
}
uchar SPI_Read(uchar reg)//SPI讀取一個字節
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
delay_ms(1);
reg_val=SPI_RW(0);
delay_ms(1);
CSN=1;
return (reg_val);
}
uchar SPI_RW_Reg(uchar reg,uchar value)//寫一個自接到寄存器函數
{
uchar status;
CSN=0;
status=SPI_RW(reg);
delay_ms(1);
SPI_RW(value);
delay_ms(1);
CSN=1;
return (status);
}
uchar *ucharostr(uchar num)
{
uchar x00,xx,x0,x,n;
x00=num/100;
xx=num0;
x0=xx/10;
x=xx;
n=0;
if(x00!=0)
{
str[n]=x00+48;
n++;
}
if(!(x00==0&x0==0))
{
str[n]=x0+48;
n++;
}
str[n]=x+48;
n++;
str[n]='\0';
return str;
}
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar uchars)//用于讀數據,reg:寄存器地址,pBuf:帶度數數據地址,uchars數據個數
{
uchar status,uchar_ctr;
CSN=0;
status=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr
{
pBuf[uchar_ctr]=SPI_RW(0);
}
CSN=1;
return (status);
}
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
SPI_RW(*pBuf++);
CSN = 1; //關閉SPI
return(status); //
}
void init_NRF24L01(void)
{
delay_ms(1);
CE=0; //射頻停止工作
CSN=1;
SCK=0;
IRQ=1;//中斷復位
SPI_RW_Reg(WRITE_REG+EN_AA,0x00);//頻道0自動,ack應答禁止
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x00);//禁止自動發送
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x00);//允許接收地址只有頻道0
SPI_RW_Reg(WRITE_REG+RF_CH,1);//設置信道工作為2.4GHZ,收發必須一致
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//設置接收數據長度,32字節
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//發射速率2MHZ,發射功率最大為0dB
}
void nRF24L01_TxPacket(unsigned char *tx_buf) //發送tx_buf總中數據
{
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_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);//裝在要發送的數據
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);//IRQ收發完成中斷響應,16位CRC,發送模式
CE=1;//置高CE,激發數據發送
delay_ms(1);
}
void main(void)
{ uchar fifo_s;
uchar status;
uchar i;
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xB0;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xff;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
CE=0;
CSN=1;
SCK=0;
IRQ=1;
status=0;
//lcd12864_init();
delay_ms(100);
init_NRF24L01();
delay_ms(10);
i=1;
while (1)
{
TxBuf[0]=i;//把發送次數寫入要發送的數據首和尾
SPI_RW_Reg(WRITE_REG+STATUS,0xff);//清狀態寄存器
SPI_RW_Reg(FLUSH_TX,0xff);//清空發送緩沖區
delay_ms(10);
nRF24L01_TxPacket(TxBuf);//進行一次發送操作
delay_ms(100);
//SPI_Write_Buf(WR_TX_PLOAD,TxBuf,TX_PLOAD_WIDTH);//裝載數據
i++;
if(i==127) i=1;
delay_ms(2000);
};
}
|