?? main.c
字號:
//------------------------
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <compat/twi.h>
#include <avr/delay.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
//------------------------
//宏定義
#define fosc 7372800 //晶振7.3728MHZ
#define baud 9600 //波特率
//nrf905
#define CONTROL_PORT PORTD
#define CONTROL_DDR DDRD
#define CONTROL_PIN PIND
#define TRX_CE PD6 //使能芯片發(fā)射或接收
#define TXEN PD5 //1 TX模式,0 RX模式
#define PWR_UP PD7 //芯片上電
//#define AM PD1 //INT1 //地址匹配
//#define CD PD2 //INT2 //載波檢測
#define DR PD2 //INT0 //接收或發(fā)射數(shù)據(jù)完成
#define CSN PD4 //SPI使能
unsigned char tx_data_buf[32]; //發(fā)送緩沖區(qū)
unsigned char rx_data_buf[32]; //接收緩沖區(qū)
unsigned char xxx[10]; //配置RF寄存器的數(shù)據(jù)緩沖區(qū)
//地址寄存器
const unsigned char tx_address_reg_buf[4]={
0xa5, //TX_ADDRESS_BYTE0=RX_ADDRESS_BYTE0
0xb5, //TX_ADDRESS_BYTE1=RX_ADDRESS_BYTE1
0xc5, //TX_ADDRESS_BYTE2=RX_ADDRESS_BYTE2
0xd5, //TX_ADDRESS_BYTE3=RX_ADDRESS_BYTE3
};
//配置寄存器為10個字節(jié)
//芯片上電后初始化值為6C 00 44 20 20 E7 E7 E7 E7 E7
//DATASHEET P20
const unsigned char config_reg_buf[10]={
0x4c,//0b01001100, //CH_NO[7:0]=76,RFfreq=422.4+76/10=430MHZ
0x00,//0b00000000, //bit[7:6]:notused /bit5:AUTO_RETRAN=’0’
//bit4:RX_RED_PWR=’0’/bit[3:2]:PA_PWR=’00’-10dBm
//bit1:HFREQ_PLL=0, PLL=433MHZ /bit0:CH_NO[8]=’0’
0x44,//0b01000100, //bit7:not used/bit[6:4]:TX_AFW=’100’4Bytes
//bit3:not used/bit[2:0]:RX_AFW=’100’4Bytes
0x20,//0b00100000, //bit[7:6]:not use /bit[5:0]:RX_PW=’100000'32Bytes
0x20,//0b00100000, //bit[7:6]not use /bit[5:0]TX_PW=’100000’32Bytes
0xa5, //RX_ADDRESS_BYTE0=TX_ADDRESS_BYTE0
0xb5, //RX_ADDRESS_BYTE1=TX_ADDRESS_BYTE1
0xc5, //RX_ADDRESS_BYTE2=TX_ADDRESS_BYTE2
0xd5, //RX_ADDRESS_BYTE3=TX_ADDRESS_BYTE3
0xce //0b11001110 //bit7:CRC_MODE=’1’CRC16 /bit6:CRC_EN=’1’ CRC Enable
//bit[5:3]:XOF=’011’8MHZ /bit[2]UP_CLK_EN=’1’ Enable
//bit[1:0]:UP_CLK_FRE=’11’ 500KHZ
};
volatile unsigned char re_ok=0;
void delay_1us(void);
void delay_nus(unsigned int n);
void delay_1ms(void);
void delay_nms(unsigned int n);
//------------------------
void port_init(void)
{
//所有端口設(shè)為輸入,所有端口的上拉電阻有效
//所有端口輸出為高電平
// PortB
PORTB = 0xff;
DDRB = 0x00;
// PortC
PORTC = 0xff;
DDRC = 0x00;
// PortD
PORTD = 0xff;
DDRD = 0x00;
}
/*---------------UART0初始化----------------*/
void uart_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = (1<<URSEL )| 0x06; //URSEL=1時才能寫UCSRC,8位
UBRRL=(fosc/16/(baud+1))%256;
UBRRH=(fosc/16/(baud+1))/256;
UCSRB = 0x18; //允許接收,允許發(fā)送。
//UCSRB = 0x98; //允許串口接收中斷,允許接收,允許發(fā)送。
}
void SPI_MasterInit(void)
{
/* 設(shè)置MOSI 和SCK SS為輸出,其他為輸入 */
DDRB |= (1<<PB5)|(1<<PB3)|(1<<PB2);
/* 使能SPI 主機(jī)模式,設(shè)置時鐘速率為fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_transmit(char cData)
{
/* 啟動數(shù)據(jù)傳輸 */
SPDR = cData;
/* 等待傳輸結(jié)束 */
while(!(SPSR & (1<<SPIF)))
;
}
unsigned char SPI_receive(void)
{
/* 啟動數(shù)據(jù)傳輸 */
SPDR = 0x00;
/* 等待傳輸結(jié)束 */
while(!(SPSR & (1<<SPIF)))
;
return SPDR;
}
//串口接收完成中斷程序
SIGNAL(SIG_UART_RECV)
{
}
//===============================================
//串口函數(shù)
//===============================================
/*---------------字符輸出函數(shù)---------------*/
void put1char(unsigned char c)
{
while (!(UCSRA&(1<<UDRE)));
UDR=c;
}
/*---------------字符輸入函數(shù)---------------*/
unsigned char get1char(void)
{
while (!(UCSRA&(1<<RXC)));
return UDR;
}
/*---------------字符串輸出函數(shù)-------------*/
int puts(char *s)
{
while (*s)
{
put1char(*s);
s++;
}
put1char(0x0a);//回車換行
put1char(0x0d);
return 1;
}
/*---------不含回車換行的字符串輸出函數(shù)----*/
void putstr(char *s)
{
while (*s)
{
put1char(*s);
s++;
}
}
//===============================================
//延時函數(shù)
//===============================================
//1us延時函數(shù)
void delay_1us(void)
{
asm( "nop" ); //4m時為1us,8m時為0.125us,16m時為0.25us.
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" ); //4m時為1us,8m時為0.125us,16m時為0.25us.
asm( "nop" );
asm( "nop" );
asm( "nop" );
}
//n us 延時函數(shù)
void delay_nus(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)delay_1us();
}
//1ms延時函數(shù)
void delay_1ms(void)
{
unsigned int i;
for(i=0;i<600;i++) delay_1us();
}
//n ms延時函數(shù)
void delay_nms(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)delay_1ms();
}
//======================================================
//以下是有關(guān)NRF905的函數(shù)
//======================================================
//寫TX地址4個字節(jié)
void write_tx_address(unsigned char tx_address_bytes_num)
{
unsigned char i;
CONTROL_PORT &= ~(1<<CSN);
SPI_transmit(0x22);//0b00100010
i=0;
while(tx_address_bytes_num--)
{
SPI_transmit(tx_address_reg_buf[i]);
i++;
}
CONTROL_PORT |= (1<<CSN);
}
//寫TX有效數(shù)據(jù)32個字節(jié)
void write_tx_payload(unsigned char tx_payload_bytes_num)
{
unsigned char i=0;
CONTROL_PORT &= ~(1<<CSN);
SPI_transmit(0x20);//0b00100000
while(tx_payload_bytes_num--)
{
SPI_transmit(tx_data_buf[i]);
i++;
}
//SPI_transmit(tx_data_buf[1]);
//SPI_transmit(tx_data_buf[2]);
CONTROL_PORT |= (1<<CSN);
}
void read_rx_payload(unsigned char rx_payload_bytes_num)
{
unsigned char i;
//CSN=0;
CONTROL_PORT &= ~(1<<CSN);
SPI_transmit(0x24);//0b00100100
i=0;
while(rx_payload_bytes_num--)
{
rx_data_buf[i]=SPI_receive();
i++;
}
//CSN=1;
CONTROL_PORT |= (1<<CSN);
}
void send_rx_data_to_pc(void)
{
unsigned char i;
i=0;
for(i=0;i<32;i++) //send ASCII char'Comait CRM401XNC'use UART
{
put1char(rx_data_buf[i]);
}
}
//發(fā)送RF數(shù)據(jù)
void send_rf_data(void)
{
unsigned char i;
write_tx_address(4);
write_tx_payload(32);
CONTROL_PORT |= (1<<TRX_CE);
i=100;
while(i--); //等待NRF905數(shù)據(jù)傳輸完成
CONTROL_PORT &= ~(1<<TRX_CE);
}
//發(fā)送模式
void transmit_mode(void)
{
//nrf905進(jìn)入發(fā)送模式
CONTROL_PORT |= (1<<PWR_UP);
CONTROL_PORT |= (1<<TRX_CE);
CONTROL_PORT |= (1<<TXEN);
delay_nms(2);
}
//接收模式
void receive_mode(void)
{
//nrf905進(jìn)入接收模式
CONTROL_PORT |= (1<<PWR_UP);
CONTROL_PORT |= (1<<TRX_CE);
CONTROL_PORT &= ~(1<<TXEN);
delay_nms(2);
}
void read_config(void)
{
unsigned char i ;
CONTROL_PORT &= ~(1<<CSN);
SPI_transmit(0x10); //0b00010000
i =0;
for(i=0;i<10;i++)
{
xxx[i]=SPI_receive();
}
CONTROL_PORT |= (1<<CSN);
}
void write_config(void)
{
unsigned char i ;
CONTROL_PORT &= ~(1<<CSN);
SPI_transmit(0x00); //發(fā)送寫配置寄存器的命令
i =0;
for(i=0;i<10;i++)
{
SPI_transmit(config_reg_buf[i]);
}
CONTROL_PORT |= (1<<CSN);
}
//nrf905初始化
void nrf905_init(void)
{
unsigned char i;
delay_nms(10);
//STANDBY和SPI編程模式
CONTROL_PORT |= (1<<PWR_UP);
CONTROL_PORT &= ~(1<<TRX_CE);
CONTROL_PORT &= ~(1<<TXEN);
CONTROL_PORT |= (1<<CSN);
i=0;
for(i=0;i<32;i++) //Clear the data buffer 清接收緩沖區(qū)
{
rx_data_buf[i]=0;
tx_data_buf[i]=0;
}
write_config();
}
//外部中斷0中斷服務(wù)函數(shù)
SIGNAL(SIG_INTERRUPT0)
{
read_rx_payload(32); //保存在rx_data_buf里
re_ok=1;
}
//====================================================================
//主程序開始
//====================================================================
int main(void)
{
//------------------------
cli();
port_init();
uart_init();
SPI_MasterInit();
sei();
DDRD |= (1<<PD3); //LED
CONTROL_DDR |= (1<<TRX_CE);
CONTROL_DDR |= (1<<TXEN);
CONTROL_DDR |= (1<<PWR_UP);
CONTROL_DDR |= (1<<CSN);
//standby 模式
CONTROL_PORT |= (1<<PWR_UP);
CONTROL_PORT &= ~(1<<TRX_CE);
nrf905_init();
receive_mode(); //接收模式
delay_nms(5);
//外部中斷0上升沿中斷
MCUCR |= (1<<ISC01)|(1<<ISC00);
GICR |= (1<<INT0);
tx_data_buf[0]=0x18;
tx_data_buf[1]=0xea;
tx_data_buf[2]=0x23;
tx_data_buf[3]=0xe2;
tx_data_buf[4]=0xf5;
while(1)
{
if(get1char()==0x26)
{
transmit_mode(); //發(fā)射模式
send_rf_data(); //發(fā)送數(shù)據(jù)包
receive_mode(); //接收模式
PORTD ^= (1<<PD3); //LED
}
if(re_ok==1)
{
re_ok=0;
send_rx_data_to_pc();
}
} //while
} //main
//====================================================================
//主程序結(jié)束
//====================================================================
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -