📄 si4421.c
字号:
/*** ============================================================================**** FILE** Si4421.c**** DESCRIPTION** Contains all Si4421 handle function **** CREATED** Silicon Laboratories Hungary Ltd**** COPYRIGHT** Copyright 2008 Silicon Laboratories, Inc. ** http://www.silabs.com**** ============================================================================*/#include "Si4421.h"#include "uart.h"#include "S8051.h" /* =========================================================== * * GLOBAL variables * * =========================================================== */rf_packet packet;xdata uint8 RxPacketPtr; // receive packet pointerxdata uint8 RxPacketLen; // receinve packet lengthxdata RX_STATES RxState; // receive state xdata uint8 rf_ch; // frequency channel select xdata uint8 rf_pwr; // rf output powerxdata uint16 rf_dr; // data rate select/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + FUNCTION NAME: void init_ezradio(void) + + DESCRIPTION: Initialize the EZRadio + + INPUT: None + + RETURN: None + + NOTES: the header file -generated from WDS- has to be included! + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void init_ezradio(void){ uint16 freq_set_cmd; uint16 transmitter_cont_cmd; uint16 datarate_cmd; /*default rf parameters*/ rf_ch = 0; /*default frequency channel = 0*/ rf_dr = 9600; /*default datarate*/ rf_pwr = 7; /*default RF output power*/ //Initialize the IA4421 transceiver if it is included into the project send_control_command(0xFF00); delay_ms(10); send_control_command(IA4421_CONFIGSET_CMD); send_control_command(IA4421_POWERMAN_CMD); freq_set_cmd = set_frq(rf_ch); send_control_command(freq_set_cmd); datarate_cmd = set_dr(rf_dr); send_control_command(datarate_cmd); send_control_command(IA4421_RECEIVERCNT_CMD); send_control_command(IA4421_DATAFILTER_CMD); send_control_command(IA4421_FIFO_RESET_CMD); send_control_command(IA4421_SYNCPATT_CMD); send_control_command(IA4421_AFC_CMD); transmitter_cont_cmd = set_tx(RF_DEV, rf_pwr); send_control_command(transmitter_cont_cmd); send_control_command(IA4421_PLLSET_CMD); send_control_command(IA4421_WTC_CMD); send_control_command(IA4421_LOWDUTYCCL_CMD); send_control_command(IA4421_LBD_CMD); ia4421_status_read();}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + FUNCTION NAME: void ia4221_enable_pa(void) + + DESCRIPTION: Turn on the power amplifier of the IA4421 + + INPUT: None + + RETURN: None + + NOTES: None + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void ia4421_enable_tx(void){ //enable the crystal, synthesizer, PA and disable the uCLK output send_control_command(IA4421_POWERMAN_CMD | 0x0020);}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + FUNCTION NAME: void ia4421_enable_rx(void) + + DESCRIPTION: Enable the receiver chain of IA4421 + + INPUT: None + + RETURN: None + + NOTES: None + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void ia4421_enable_rx(void){ //disable TX and RX send_control_command(IA4421_POWERMAN_CMD); //reset FIFO send_control_command(IA4421_FIFO_RESET_CMD); //************************************************************************ send_control_command(IA4421_CONFIGSET_CMD | 0x0040); //************************************************************************ //enable receiver send_control_command(IA4421_POWERMAN_CMD | 0x0080); //enable FIFO synchron latch send_control_command(IA4421_FIFO_RESET_CMD | 0x0002); //read status to releaze all IT flags ia4421_status_read(); RxPacketLen = 0; RxPacketPtr = 0; //initialize state machine RxState = sWaitForLength;}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + FUNCTION NAME: uint8 Receive_packet(void) + + DESCRIPTION: Try to receive bytes in FIFO mode + + INPUT: None + + RETURN: PACKET_RECEIVED - a packet received correctly, RX stoped + NODATA - no incoming byte + DATA_RECEIVED - next byte received + + NOTES: + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/uint8 Receive_packet(void){ static uint8 ch; RF_NSEL = 0; // FFIT appears on SPI_SDI if( RF_FFIT == 1 ) // Read out the FIFO in case of FFIT { //---- There is data in the RX FIFO RF_NFFS = 0; RF_NSEL = 1; //Select FIFO into the SPI pins //read one byte from the FIFO ch = spi_read_write_byte(0); //packet receiving state machine switch( RxState ) { /*wait for the first byte: LENGTH*/ case sWaitForLength: //check whether the length is correct or not if( (ch > 0) && (ch < MAX_LENGTH) ) {//length is correct RxPacketLen = ch; //save the length byte packet.name.header[LENGTH] = ch; //next state RxState = sReceivePayload; } else {//length is incorrect, drop the packet, waits for a new packet RF_NFFS = 1; //restart receiver ia4421_enable_rx(); return NODATA; } break; case sReceivePayload: //save teh next byte of the payload packet.name.payload[RxPacketPtr++] = ch; //is the full packet received? if(RxPacketPtr >= RxPacketLen) {//packet is received //disabe the receiver send_control_command(IA4421_POWERMAN_CMD); RF_NFFS = 1; return PACKET_RECEIVED; } break; } RF_NFFS = 1; return DATA_RECEIVED; // next databyte received } else // Read out the rest IT bits in case of no FFIT { //---- No data in the RX FIFO ch = spi_read_write_byte(0); //read out the first byte of the status (5 out from 8 are the IRQ bits) return NODATA; }}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + FUNCTION NAME: void ia4421_get_received_payload(uint8 * sid, uint8 * did, uint8 * length, uint8 * payload) + + DESCRIPTION: Get the payload of the received packet + + INPUT: None + + RETURN: *sid - source address + *did - destination address + *length - length of the payload + *payload - payload of the packet + + NOTES: Call only if the Receive_packet() function returned + with PACKET_RECEIVED! + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void ia4421_get_received_payload(uint8 * length, uint8 * payload){ *length = packet.name.header[LENGTH]; memcpy(payload, packet.name.payload,(packet.name.header[LENGTH]));}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + FUNCTION NAME: uint16 ia4421_status_read(void) + + DESCRIPTION: Read status word + + INPUT: None + + RETURN: Status word + + NOTES: + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/uint16 ia4421_status_read(void){ //read status return send_control_command(0x0000);}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + FUNCTION NAME: void ia4421_send_packet(uint8 sid, uint8 did, uint8 length, uint8 * payload) + + DESCRIPTION: Send a packet + + INPUT: length - length of the payload + sid - source ID + did - destination ID + *payload - pointer to the payload of the packet + + RETURN: None + + NOTES: + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void ia4421_send_packet(uint8 length, uint8 * payload){ uint8 packet_length,i; //set the header of the packet packet.name.header[0] = 0xAA; packet.name.header[1] = 0xAA; packet.name.header[SYNCH_WORD_H] = 0x2D; //synchron word packet.name.header[SYNCH_WORD_L] = 0xD4; //set the length of the packet if( length > MAX_PAYLOAD_LENGTH ) {//if the length is longer than the buffer, then maximize it packet_length = MAX_PAYLOAD_LENGTH + HEADER_LENGTH + 2; packet.name.header[LENGTH] = MAX_PAYLOAD_LENGTH; } else { packet_length = length + HEADER_LENGTH + 2; packet.name.header[LENGTH] = length; } //set the payload of the packet memcpy(&packet.name.payload[0],payload,(packet.name.header[LENGTH])); //enables the internal dataregister send_control_command(IA4421_CONFIGSET_CMD | 0x0080); //start transmission send_control_command(IA4421_POWERMAN_CMD | 0x0020); //enable PA //send the data for(i=0;i<packet_length;i++) { //wait for the interrupt while( RF_NIRQ == 1); //send next byte send_control_command(TX_REGISTER_WRITE | packet._data[i]); } //stop transmission send_control_command(IA4421_POWERMAN_CMD); send_control_command(IA4421_CONFIGSET_CMD); //release all IT ia4421_status_read();}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + FUNCTION NAME: uint16 set_frq(uint8 ch) + + DESCRIPTION: Set the frequency channel + + INPUT: ch - channel number + + RETURN: frequency setting command + + NOTES: + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/uint16 set_frq(uint8 ch){ if( ch > FREQ_maxid ) { ch = 0; } return (0xA000 + FREQ_start + ((uint16)ch * FREQ_step));}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + FUNCTION NAME: uint16 set_tx(uint8 dev,uint8 pwr) + + DESCRIPTION: Set the deviation and the power + + INPUT: dev - deviation + pwr - power + + RETURN: transmitter control command + + NOTES: set deviation (15 ... 240kHz) and relative output power: 0..7 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/uint16 set_tx(uint8 dev, uint8 pwr) // set deviation (15 ... 240kHz) and relative output power: 0..7{ if(dev < 15) dev = 15; if(pwr > 7) pwr = 7; if(dev == 255) dev = 90; dev = dev / 15 - 1; return(0x9800 + dev * 0x10 + 7 - pwr);}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + FUNCTION NAME: uint16 set_dr(uint16 dr) + + DESCRIPTION: Set the datarate + + INPUT: dr - datarate + + RETURN: datarate command + + NOTES: set data rate (up to 32kbps) + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/uint16 set_dr(uint16 dr) // set data rate (up to 32kbps){ uint16 r; if(dr > 32000) dr = 32000; if(dr < 2700) { dr *= 8; dr /= 100; r = (3448 + dr / 2) / dr - 1; return(0xC680 + r); } else { dr /= 100; r = (3448 + dr / 2) / dr - 1; return(0xC600 + r); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -