📄 txd.c
字号:
// PWR_UP is set, CRC(2 bytes) is enabled, & PRIM:TX.
//
// ToDo: One high pulse(>10祍) on CE will now send this
// packet and expext an acknowledgment from the RX device.
//
//
// Author: RSK Date: 28.11.05
//**********************************************************
void TX_Mode(void)
{
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_LENGTH); // Writes TX_Address to nRF24L01
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_LENGTH); // RX_Addr0 same as TX_Adr for Auto.Ack
// SPI_Write_Buf(WR_TX_PLOAD, TX_PAYLOAD, TX_PLOAD_WIDTH); // Writes data to TX payload
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500祍 + 86祍, 10 retrans...
SPI_RW_Reg(WRITE_REG + RF_CH, rff); // Select RF channel 40
SPI_RW_Reg(WRITE_REG + RF_SETUP, rate); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG + CONFIG, 0x4e); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
CE1;
}
void mod_select(uchar tr)
{if(tr==1)
{SPI_COM(FLUSH_TX);
SPI_COM(FLUSH_RX);
SPI_RW_Reg(WRITE_REG + CONFIG, 0x4e);
SPI_COM(FLUSH_TX);
SPI_COM(FLUSH_RX);
}
else if(tr==0)
{
SPI_COM(FLUSH_TX);
SPI_COM(FLUSH_RX);
SPI_RW_Reg(WRITE_REG + CONFIG, 0x3f);
SPI_COM(FLUSH_TX);
SPI_COM(FLUSH_RX);
}
}
//**********************************************************
//
// Function: RX_Mode
//
// Description:
// This function initializes one nRF24L01 device to
// RX Mode, set RX address, writes RX payload width,
// select RF channel, datarate & LNA HCURR.
// After init, CE is toggled high, which means that
// this device is now ready to receive a datapacket.
//
// Author: RSK Date: 28.11.05
//**********************************************************
void RX_Mode(void)
{
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_LENGTH); // Use the same address on the RX device as the TX device
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
SPI_RW_Reg(WRITE_REG + RF_CH, rff); // Select RF channel 40
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width
SPI_RW_Reg(WRITE_REG + RF_SETUP, rate); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG + CONFIG, 0x3f); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..
//CE = 1; // Set CE pin high to enable RX device
//CE1;
// This device is now ready to receive one packet of 16 bytes payload from a TX device sending to address
// '3443101001', with auto acknowledgment, retransmit count of 10, RF channel 40 and datarate = 2Mbps.
}
uchar trans2401(uchar *databuf)
{uchar sta;
SPI_Write_Buf(WR_TX_PLOAD, databuf, TX_PLOAD_WIDTH);
SPI_Write_Buf(WR_TX_PLOAD, databuf, TX_PLOAD_WIDTH);
SPI_Write_Buf(WR_TX_PLOAD, databuf, TX_PLOAD_WIDTH);
while(flag_max<3)
{;
// if((SPI_Read(READ_REG +OBSERVE_TX)&0xf0)>0xa0)
//{ uart0_txd(0xae);SPI_RW_Reg(WRITE_REG + RF_CH, rff);return 0;}
}
flag_max=0;
return 1;
}
void testxx(uchar i)
{ flag_rx=i-1;
uart0_txd(flag_rx);
}
uchar rxd_poll(void)
{
if(rxd_fifo_out==rxd_fifo_in)return 0;
else return 1;
}
//***********************************************************************************************************************
//函数作用:从串口的fifO读取一个字节
//参数说明:无
//注意事项:
//返回说明:无
//***********************************************************************************************************************
uchar rxd_read_fifo(void)
{
uchar ch;
ch=rxd_fifo[rxd_fifo_out];//得到当前要读取的字符
rxd_fifo_out++;//指向下一个要读取的字符
if(rxd_fifo_out>=1000)rxd_fifo_out=0;//如果到了fifo末尾 则重从头开始
return ch;
}
//***********************************************************************************************************************
//函数作用:查询串口 如果有数据读取一个字节
//参数说明:ch---读取字符存放地址
//注意事项:
//返回说明:如果有数据返回1
//***********************************************************************************************************************
uchar rxd_read_char(uchar *ch)
{
if(!rxd_poll())return 0;
*ch=rxd_read_fifo();
return 1;
}
//////////$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//////////$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//////////$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//////////$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
#pragma interrupt_handler uart0_isr:19
static void uart0_isr(void)
{ uchar temp,i;
UA00R= UDR0;
uart0_txd(UA00R);
if(UA00R==0x01)
{mod_select(1);//1 tx 0 rx
TX_PAYLOAD[0]=0XD7; TX_PAYLOAD[1]=0X31;
TX_PAYLOAD[2]=0XA0; TX_PAYLOAD[3]=0X7D;
SPI_Write_Buf(WR_TX_PLOAD, TX_PAYLOAD, TX_PLOAD_WIDTH);
cmd_or_data=1;
}
else if(UA00R==0x02)
{mod_select(1);//1 tx 0 rx
TX_PAYLOAD[0]=0XD7; TX_PAYLOAD[1]=0X31;
TX_PAYLOAD[2]=0XA1; TX_PAYLOAD[3]=0X7D;
SPI_Write_Buf(WR_TX_PLOAD, TX_PAYLOAD, TX_PLOAD_WIDTH);
cmd_or_data=0;
// rxdtemp=0;
}
}
BYTE spi_read_fifo(BYTE reg, BYTE bytes)
{
BYTE status,byte_ctr;
SS0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status byte
byte_ctr=SPI_RW(0);
if((byte_ctr==(rxdtemp+1))||(cmd_or_data==1))
{
if(cmd_or_data==1)//如果是命令数据
rxd_fifo[rxd_fifo_in++]=byte_ctr;
else rxdtemp=byte_ctr;
////////////////////////////
// rxd_fifo[rxd_fifo_in++]=byte_ctr;
//////////////////////////////////
for(byte_ctr=0;byte_ctr<(bytes-1);byte_ctr++)
{rxd_fifo[rxd_fifo_in++]=SPI_RW(0);
if(rxd_fifo_in>=RXD_FIFO_SIZE)rxd_fifo_in=0;
}
}
else
{error++;uart0_txd(0xad);
if(error>=10)
//PORTF=0X00;
LED_OFF;
for(byte_ctr=0;byte_ctr<(bytes-1);byte_ctr++)
SPI_RW(0);
}
// *pdata++=SPI_RW(0);
SS1; // Set CSN high again
if(((rxd_fifo_in-rxd_fifo_out)>=800)&&(rxd_fifo_in>rxd_fifo_out))
{//start_stop=0;
rxd_stop;
//uart0_txd(0xbb);
}
if(((rxd_fifo_out-rxd_fifo_in)<=200)&&(rxd_fifo_in<rxd_fifo_out))
{//start_stop=0;
rxd_stop;
}
return(status); // return nRF24L01 status byte
}/*
BYTE spi_read_fifo(BYTE reg, BYTE bytes)
{
BYTE status,byte_ctr;
SS0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status byte
byte_ctr=SPI_RW(0);
if(byte_ctr==(rxdtemp+1))
{rxdtemp=byte_ctr;
////////////////////////////
// rxd_fifo[rxd_fifo_in++]=byte_ctr;
//////////////////////////////////
for(byte_ctr=0;byte_ctr<(bytes-1);byte_ctr++)
{rxd_fifo[rxd_fifo_in++]=SPI_RW(0);
if(rxd_fifo_in>=RXD_FIFO_SIZE)rxd_fifo_in=0;
}
}
else
{error++;
if(error>=10)
PORTF=0X00;
for(byte_ctr=0;byte_ctr<(bytes-1);byte_ctr++)
SPI_RW(0);
}
// *pdata++=SPI_RW(0);
SS1; // Set CSN high again
if(((rxd_fifo_in-rxd_fifo_out)>=800)&&(rxd_fifo_in>rxd_fifo_out))
{//start_stop=0;
rxd_stop;
//uart0_txd(0xbb);
}
if(((rxd_fifo_out-rxd_fifo_in)<=200)&&(rxd_fifo_in<rxd_fifo_out))
{//start_stop=0;
rxd_stop;
}
return(status); // return nRF24L01 status byte
}*/
void get_data_message(void)
{uchar temp;
while(rxd_read_char(&temp))
{//uart0_txd(temp);
// return ;
// delayms(1);
if(step1==0)
{
if(temp==0xff)
{step1=1;
//uart0_txd(0xdd);
}
}
else if(step1==1)
{
if(temp==0xd8)
{
step1=2;
//dainc=1;
// dataindex=0;
// databuffer[dataindex++]=dainc++;
uart0_txd(0xff);
uart0_txd(0xd8);
}
else if(temp==0xe2)
step1=3;
else
step1=0;
}
else if(step1==2)
{
if((temp==0xff)&&(step2==0))
step2=1;
else if(step2==1)
{ step2=0;
if(temp==0xd9)
{
step1=0;
rxdtemp=0;
uart0_txd(0xff);
uart0_txd(0xd9);
}
else
{
uart0_txd(0xff);
uart0_txd(temp);
}
}//else if(step2==1)
else//主要数据接收
{if(((rxd_fifo_in-rxd_fifo_out)<=200)&&(rxd_fifo_in>rxd_fifo_out))
{//start_stop=1;
//delayms(1);
rxd_start;
}
if(((rxd_fifo_out-rxd_fifo_in)>=800)&&(rxd_fifo_in<rxd_fifo_out))
{ rxd_start;
//delayms(1);
}
uart0_txd(temp);
}
}
else if(step1==3)
{
}
else if(step1==4)
{
}
else
{
step1=0;
}
}
}
void out(void)
{
//DDRA=0X00;
A00;//
A10;// 选择68013的2号端口作为输出口所以这里PORTA作为输入DDRA=0X00;
OE0;
}
void get_usb_cmd(void)
{ uchar i=0;
out();
while(FLAGC)//FLAGB FULL FLAGC EMPTY
{TX_PAYLOAD[i++]=exemm1;
if(i==32)
{ mod_select(1);//1 tx 0 rx
if(TX_PAYLOAD[2]==0xa0)
cmd_or_data=1;
else if(TX_PAYLOAD[2]==0xa1)
cmd_or_data=0;
uart0_txd(TX_PAYLOAD[2]);
SPI_Write_Buf(WR_TX_PLOAD, TX_PAYLOAD, TX_PLOAD_WIDTH);
}
}
in();
}
void get_cmd_message(void)
{uchar temp,i;
while(rxd_read_char(&temp))
{ in();
if(FLAGB)
{ write_usb_count++;
exemm1=temp;
if(write_usb_count==32)
{write_usb_count=0;
PK0;PK1;
}
}
}
}
void get_data_message_usb(void)
{uchar temp;
while(rxd_read_char(&temp))
{//uart0_txd(temp);
// return ;
// delayms(1);
if(step1==0)
{
if(temp==0xff)
{step1=1;
//uart0_txd(0xdd);
}
}
else if(step1==1)
{
if(temp==0xd8)
{write_usb_count2=0;
step1=2;
//dainc=1;
// dataindex=0;
// databuffer[dataindex++]=dainc++;
// uart0_txd(0xff);
// uart0_txd(0xd8);
in();
while(!FLAGB);//FLAGB FULL FLAGC EMPTY
write_usb_count2++;
exemm1=0xff;
write_usb_count2++;
exemm1=0xd8;
}
else if(temp==0xe2)
step1=3;
else
step1=0;
}
else if(step1==2)
{
if((temp==0xff)&&(step2==0))
step2=1;
else if(step2==1)
{ step2=0;
if(temp==0xd9)
{
step1=0;
rxdtemp=0;
//uart0_txd(0xff);
//uart0_txd(0xd9);
in();
while(!FLAGB);//FLAGB FULL FLAGC EMPTY
write_usb_count2++;
exemm1=0xff;
if(write_usb_count2==32)
{write_usb_count2=0;
PK0;PK1;
}
in();
while(!FLAGB);//FLAGB FULL FLAGC EMPTY
write_usb_count2++;
exemm1=0xd9;
while(write_usb_count2<32)
{exemm1=0x00;
write_usb_count2++;
}
//if(write_usb_count2==32)
write_usb_count2=0;
PK0;PK1;
}
else
{
//uart0_txd(0xff);
// uart0_txd(temp);
in();
while(!FLAGB);//FLAGB FULL FLAGC EMPTY
write_usb_count2++;
exemm1=0xff;
if(write_usb_count2==32)
{write_usb_count2=0;
PK0;PK1;
}
in();
while(!FLAGB);//FLAGB FULL FLAGC EMPTY
write_usb_count2++;
exemm1=temp;
if(write_usb_count2==32)
{write_usb_count2=0;
PK0;PK1;
}
}
}//else if(step2==1)
else//主要数据接收
{if(((rxd_fifo_in-rxd_fifo_out)<=200)&&(rxd_fifo_in>rxd_fifo_out))
{//start_stop=1;
//delayms(1);
rxd_start;
}
if(((rxd_fifo_out-rxd_fifo_in)>=800)&&(rxd_fifo_in<rxd_fifo_out))
{ rxd_start;
//delayms(1);
}
//uart0_txd(temp);
in();
while(!FLAGB);//FLAGB FULL FLAGC EMPTY
write_usb_count2++;
exemm1=temp;
if(write_usb_count2==32)
{write_usb_count2=0;
PK0;PK1;
}
}
}
else if(step1==3)
{
}
else if(step1==4)
{
}
else
{
step1=0;
}
}
}
void in(void)
{
A00;//
A11;//选择68013的4号端口作为输入口 和上面相反
OE1;
}
void main()
{
uchar i,xff ;
flag_max=0;
flag_rx=0;
CLI();
port_init();
uart0_init((ulong)115200);
MCUCR |= 0xC0;
spi_init();
exint_init(0,2);//x=0---7 //kind 0--3 0 低电平 大板中断0
// exint_init(7,2);//x=0---7 //kind 0--3 0 低电平 小板中断7
delayms(100);
out(); //select usb out fifo
xff=8;
txdtime=0; rxd_count=0;
////////////////////////////2401 2401
CE0;
TX_Mode();
delayms(200);
CE1;
delayms(200);
mod_select(0);//1 tx 0 rx
EIFR=0XFF;
delayms(2300);
SEI();
delayms(1000);
flag_rx=0;
i=0;
rxdtemp=0;
//while(1);
while(1)
{if(cmd_or_data==0)
// get_data_message();
get_data_message_usb();
if(cmd_or_data==1)
get_cmd_message();
get_usb_cmd();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -