📄 nrf905_jinju._c
字号:
{
BYTE i;
nrF905_Standby_Mode();
ms(10);
while(1) {
CSN_L;
SPI_Char(0,W_CONFIG);
for ( i=0; i<10; i++ ) {
SPI_Char(0,Register[i]);
}
CSN_H;
if ( !SPI_R_CONFIG() ) break;
}
nrF905_RX_Mode();
}
/////////////////////////////////////////////////////////////
BYTE SPI_R_TX_PAYLOAD()
{
BYTE i,len;
spi_rxpt = 0;
spi_handlept = 0;
nrF905_Standby_Mode();
CSN_L;
SPI_Char(0,R_TX_PAYLOAD);
len = Register[4] & 0x3F;
for ( i=0; i<len; i++ ) SPI_Char(1,0xff);
CSN_H;
return spi_handle(R_TX_PAYLOAD);
}
/////////////////////////////////////////////////////////////
void SPI_W_TX_PAYLOAD()
{
BYTE i,len;
CSN_L;
SPI_Char(0,W_TX_PAYLOAD);
len = Register[4] & 0x3F;
for ( i=0; i<16; i++ ) {
SPI_Char(0,tx_buf[i]);
//uart_TxChar(tx_buf[i]);
}
CSN_H;
}
/////////////////////////////////////////////////////////////
BYTE SPI_R_TX_ADDRESS()
{
BYTE i,len;
spi_rxpt = 0;
spi_handlept = 0;
nrF905_Standby_Mode();
CSN_L;
SPI_Char(0,R_TX_ADDRESS);
len = (Register[2] >> 4) & 0x07;
for ( i=0; i<len; i++ ) SPI_Char(1,0xff);
CSN_H;
return spi_handle(R_TX_ADDRESS);
}
/////////////////////////////////////////////////////////////
void SPI_W_TX_ADDRESS()
{
BYTE i,len;
CSN_L;
SPI_Char(0,W_TX_ADDRESS);
len = (Register[2] >> 4) & 0x07;
for ( i=0; i<len; i++ ) {
SPI_Char(0,tx_addr[i]);
}
CSN_H;
}
/////////////////////////////////////////////////////////////
BYTE SPI_R_RX_PAYLOAD()
{
BYTE i,len;
spi_rxpt = 0;
spi_handlept = 0;
TRX_CE_L;
// nrF905_Standby_Mode();
CSN_L;
SPI_Char(0,R_RX_PAYLOAD);
len = Register[3] & 0x3f;
while(DR) {
SPI_Char(1,0xff);
}
CSN_H;
return spi_handle(R_RX_PAYLOAD);
}
/*////////////////////////////////////////////////////////////
void MakeFrame(BYTE cmd)
{
BYTE i;
switch(cmd) {
case CMD_ASKDATA:
// CallData();
break;
case CMD_RETDATA:
// ReportData();
break;
case CMD_DOWNPARA:
// SetPara();
break;
case CMD_RETPARA:
// RetPara();
break;
}
for ( i=0; i<tx_len; i++ ) uart_TxChar(tx_buf[i]);
for ( i=tx_len; i<16; i++ ) tx_buf[i] = 0;
}
/////////////////////////////////////////////////////////////
*/
//void SendGram(BYTE cmd)
void SendGram()
{
// MakeFrame(cmd);
nrF905_RX_Mode();
// uart_TxChar('1');
while(CD) {;}
// uart_TxChar('2');
while(AM) {;}
// uart_TxChar('3');
nrF905_TX_Mode();
SPI_W_TX_ADDRESS();
SPI_W_TX_PAYLOAD();
// uart_TxChar('4');
TRX_CE_H;
us(20);
// uart_TxChar('5');
TRX_CE_L;
while (!DR);
nrF905_RX_Mode();
}
/////////////////////////////////////////////////////////////
void handle(void)
{
BYTE len,i,num,startno;
// WORD id;
// BYTE lpc;
if ( spi_rxbuf[0] != 0xeb ) return;
if ( spi_rxbuf[1] != 0x90 ) return;
switch(spi_rxbuf[2]) {
case CMD_RETDATA:
num = spi_rxbuf[5];
startno = spi_rxbuf[6];
if(num > 3){
if(startno == 0) len = 16;
else len = 8+(num-startno)*2;
}
else len = 8+num*2;
break;
case CMD_RETPARA:
len=14;
break;
case CMD_SETID_OK:
len = 6;
break;
case CMD_READID:
len = 6;
break,
default:
return;
}
/* if ( GetLPC(spi_rxbuf,len) ) return;
switch(spi_rxbuf[2]) {
case CMD_RETDATA:
// put_bytes(spi_rxbuf,len);
break;
case CMD_RETPARA:
// put_bytes(spi_rxbuf,len);
break;
}
*/
//uart_TxChar(len);
put_bytes(spi_rxbuf,len);
}
/////////////////////////////////////////////////////////////
void ReceiveGram()
{
if ( !DR ) return;
// SPI_R_CONFIG();
SPI_R_RX_PAYLOAD();
}
/////////////////////////////////////////////////////////////
void timer1_init(void)
{
WORD timer;
timer=fosc/1024;
TCNTData=0xffff-timer;
TIMSK |= 0x04;
NOP();
TCCR1B = 0x00;
TCNT1H = (TCNTData>>8)&0xff;
TCNT1L = TCNTData&0xff;
OCR1AH = 0x00;
NOP();
OCR1AL = 0x00;
NOP();
OCR1BH = 0x00;
NOP();
OCR1BL = 0x00;
NOP();
TCCR1A = 0x00;
NOP();
TCCR1B = 0x05;
}
/////////////////////////////////////////////////////////////////////////////////
#pragma interrupt_handler timer1_ovf_isr:iv_TIMER1_OVF
void timer1_ovf_isr(void)
{
TCNT1H = (TCNTData>>8)&0xff;;
NOP();
TCNT1L = TCNTData&0xff;
Count++;
if ( Count < 120 ) WDR();
if ( FlashFlag ) {
if ( FlashFlag % 2 ) LED_L;
else LED_H;
FlashFlag--;
}
else LED_H;
SecondCount++;
if ( SecondCount % 2 ) SendDataFlag = 1;
if ( SecondCount >= SENDTIMER ) {
SecondCount = 0;
// spi_txflag = 1;
}
NoDataCount++;
}
/////////////////////////////////////////////////////////////////////////////////
void put_str(char *str)
{
int i,len;
len = strlen(str);
for ( i=0; i<len; i++ )
uart_TxChar(str[i]);
}
/////////////////////////////////////////////////////////////////////////////////
void put_str_CRLF(char *str)
{
put_str(str);
uart_TxChar(0x0d);
uart_TxChar(0x0a);
}
/////////////////////////////////////////////////////////////////////////////////
void wdt_init(void)
{
WDR();//喂狗
WDTCR|=(BIT(WDCE)|BIT(WDE));
WDTCR=BIT(WDP2)|BIT(WDP1)|BIT(WDP0)|BIT(WDE);
}
/////////////////////////////////////////////////////////////////////////////////
//uart完成中断
#pragma interrupt_handler uart_Rx_isr:iv_USART_RXC
void uart_Rx_isr(void)
{
rxbuf[rxpt] = UDR;
// uart_TxChar(rxbuf[rxpt]);
rxpt++;
rxpt &= RXBUF_LEN1;
}
/////////////////////////////////////////////////////////////////////////////////
void Spi_InitRegister(void)
{
// Register[0] = 0x6c; // 433.2MHZ
// Register[1] = 0x0c; //不重发,正常模式,输出+10dBm,433M频段
Register[0] = CH_NO_BYTE; // 433.2MHZ
Register[1] = PA_PWR_10dBm | HFREQ_PLL_433MHz; //不重发,正常模式,输出+10dBm,433M频段
Register[2] = 0x44; //TX、RX地址宽度为4
Register[3] = 0x10; //收为16个有效数据
Register[4] = 0x10; //发为16个有效数据
Register[5] = ADDR_1; //本机收地址
Register[6] = ADDR_2;
Register[7] = ADDR_3;
Register[8] = ADDR_4;
Register[9] = 0xD8; //CRC校验16位,16M晶振
tx_addr[0] = ADDR_1;
tx_addr[1] = ADDR_2;
tx_addr[2] = ADDR_3;
tx_addr[3] = ADDR_4;
TxFlag[0] = 0;
TxFlag[1] = 0;
TxFlag[2] = 0;
TxFlag[3] = 0;
TxFlag[4] = 0;
TxFlag[5] = 0;
}
/////////////////////////////////////////////////////////////
void InitSPI(void)
{
Spi_InitRegister();
SPI_MasterInit();
SPI_W_CONFIG();
}
/////////////////////////////////////////////////////////////
void uart_handle(void)
{
int len,len1,i;
BYTE cmd,lpc=0xff;
if ( handlept == rxpt ) return;
len = (rxpt - handlept) & RXBUF_LEN1;
if ( len < 4 ) return;
for ( i=0; i<len; i++ ) buf[i] = rxbuf[(handlept+i) & RXBUF_LEN1];
if ( buf[0] != 0xeb ) {
handlept = (handlept + 1) & RXBUF_LEN1;
return;
}
if ( buf[1] != 0x90 ) {
handlept = (handlept + 2) & RXBUF_LEN1;
return;
}
cmd = buf[2];
if ( (cmd != CMD_ASKDATA)&&(cmd != CMD_DOWNPARA)&&(cmd != CMD_SETID)&&(cmd != CMD_READID) ) {
handlept = (handlept + 3) & RXBUF_LEN1;
return;
}
switch(cmd) {
case CMD_ASKDATA:
len1 = 7;
break;
case CMD_DOWNPARA:
len1 = 14;
break;
case CMD_SETID:
len1 = 6;
break;
case CMD_READID:
len1 = 4;
break;
}
if ( len < len1 ) return;
/*
lpc = GetLPC(buf,len1);
if ( lpc ) {
handlept = (handlept + len1) & RXBUF_LEN1;
return;
}
*/
for ( i=0; i<len1;i++ )
tx_buf[i] = rxbuf[(handlept+i) & RXBUF_LEN1];
tx_len = len1;
for ( i=tx_len; i<16; i++ ) tx_buf[i] = 0;
// put_bytes(tx_buf,len1);
SendGram();
handlept = (handlept + len1) & RXBUF_LEN1;
}
/////////////////////////////////////////////////////////////
void SendData()
{
tx_buf[0] = 0xeb;
tx_buf[1] = 0x90;
tx_buf[2] = 0x02;
tx_buf[3] = 0x00;
tx_buf[4] = 0x00;
tx_buf[5] = 0x08;
tx_buf[6] = 0x00;
tx_buf[7] = 0x0c;
tx_buf[8] = 0x02;
tx_buf[9] = 0x0b;
tx_buf[10] = 0x02;
tx_buf[11] = 0x0b;
tx_buf[12] = 0x02;
tx_buf[13] = 0x87;
tx_len = 14;
}
/////////////////////////////////////////////////////////////
void main(void)
{
int count=0,i;
BYTE portb;
// wdt_init();
spi_rxpt = 0;
spi_handlept = spi_rxpt;
uart_init();
timer1_init();
InitSPI();
SEI();//开中断
Mode = 0;
// uart_TxChar('0');
while(1) {
// uart_TxChar('1');
Count = 0;
ReceiveGram();
/*
if ( NoDataCount > NODATALIMIT ) {
NoDataCount = 0;
InitSPI();
// put_str_CRLF("Reset");
}
*/
uart_handle();
/* if ( Mode ) {
if ( SendDataFlag ) {
SendDataFlag = 0;
SendData();
put_bytes(tx_buf,tx_len);
// SendGram(CMD_CALLDATA);
}
}
*/ }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -