📄 main_sdbc_dk3.c
字号:
/*CRC Error interrupt occured*/
if( (ItStatus1 & 0x01) == 0x01 )
{
//reset the RX FIFO
SpiWriteRegister(0x08, 0x02); //write 0x02 to the Operating Function Control 2 register
SpiWriteRegister(0x08, 0x00); //write 0x00 to the Operating Function Control 2 register
//blink all LEDs to show the error
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
for(delay = 0; delay < 10000;delay++);
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
}
/*packet received interrupt occured*/
if( (ItStatus1 & 0x02) == 0x02 )
{
//Read the length of the received payload
length = SpiReadRegister(0x4B); //read the Received Packet Length register
//check whether the received payload is not longer than the allocated buffer in the MCU
if(length < 11)
{
//Get the reeived payload from the RX FIFO
for(temp8=0;temp8 < length;temp8++)
{
payload[temp8] = SpiReadRegister(0x7F); //read the FIFO Access register
}
//check whether the acknowledgement packet received
if( length == 4 )
{
if( memcmp(&payload[0], "ACK", 3) == 0 )
{
//blink LED2 to show that ACK received
LED2 = 1;
for(delay = 0; delay < 10000;delay++);
LED2 = 0;
}
}
//check whether an expected packet received, this should be acknowledged
if( length == 8 )
{
if( memcmp(&payload[0], "BUTTON1", 7) == 0 )
{
//blink LED2 to show that the packet received
LED2 = 1;
for(delay = 0; delay < 10000;delay++);
LED2 = 0;
/*send back an acknowledgement*/
//turn on LED1 to show packet transmission
LED1 = 1;
/*set packet content*/
//set the length of the payload to 4bytes
SpiWriteRegister(0x3E, 4); //write 4 to the Transmit Packet Length register
//fill the payload into the transmit FIFO
SpiWriteRegister(0x7F, 0x41); //write 0x41 ('A') to the FIFO Access register
SpiWriteRegister(0x7F, 0x43); //write 0x43 ('C') to the FIFO Access register
SpiWriteRegister(0x7F, 0x4B); //write 0x4B ('K') to the FIFO Access register
SpiWriteRegister(0x7F, 0x0D); //write 0x0D (CR) to the FIFO Access register
//Disable all other interrupts and enable the packet sent interrupt only.
//This will be used for indicating the successfull packet transmission for the MCU
SpiWriteRegister(0x05, 0x04); //write 0x04 to the Interrupt Enable 1 register
SpiWriteRegister(0x06, 0x00); //write 0x03 to the Interrupt Enable 2 register
//Read interrupt status regsiters. It clear all pending interrupts and the nIRQ pin goes back to high.
ItStatus1 = SpiReadRegister(0x03); //read the Interrupt Status1 register
ItStatus2 = SpiReadRegister(0x04); //read the Interrupt Status2 register
/*enable transmitter*/
//The radio forms the packet and send it automatically.
SpiWriteRegister(0x07, 0x09); //write 0x09 to the Operating Function Control 1 register
/*wait for the packet sent interrupt*/
//The MCU just needs to wait for the 'ipksent' interrupt.
while(NIRQ == 1);
//read interrupt status registers to release the interrupt flags
ItStatus1 = SpiReadRegister(0x03); //read the Interrupt Status1 register
ItStatus2 = SpiReadRegister(0x04); //read the Interrupt Status2 register
//wait a bit for showing the LED a bit longer
for(delay = 0; delay < 10000;delay++);
//turn off the LED
LED1 = 0;
//after packet transmission set the interrupt enable bits according receiving mode
//Enable two interrupts:
// a) one which shows that a valid packet received: 'ipkval'
// b) second shows if the packet received with incorrect CRC: 'icrcerror'
SpiWriteRegister(0x05, 0x03); //write 0x03 to the Interrupt Enable 1 register
SpiWriteRegister(0x06, 0x00); //write 0x00 to the Interrupt Enable 2 register
//read interrupt status registers to release all pending interrupts
ItStatus1 = SpiReadRegister(0x03); //read the Interrupt Status1 register
ItStatus2 = SpiReadRegister(0x04); //read the Interrupt Status2 register
}
}
}
}
//reset the RX FIFO
SpiWriteRegister(0x08, 0x02); //write 0x02 to the Operating Function Control 2 register
SpiWriteRegister(0x08, 0x00); //write 0x00 to the Operating Function Control 2 register
//enable the receiver chain again
SpiWriteRegister(0x07, 0x05); //write 0x05 to the Operating Function Control 1 register
}
}
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME: void MCU_Init(void)
+
+ DESCRIPTION: This function configures the MCU
+ P0.0 - skipped, PB0
+ P0.1 - skipped PB1
+ P0.2 - skipped, analog input, XTAL
+ P0.3 - skipped, analog input, XTAL
+ P0.4 - UART TX, push-pull output
+ P0.5 - UART RX, open drain input
+ P0.6 - skipped
+ P0.7 - skipped
+
+ P1.0 - SCK (SPI1), Push-Pull, Digital
+ P1.1 - MISO (SPI1), Open-Drain, Digital
+ P1.2 - MOSI (SPI1), Push-Pull, Digital
+ P1.3 - NSS, Push-Pull, Digital
+ P1.4 - skipped LED1
+ P1.5 - skipped LED
+ P1.6 - skipped LED
+ P1.7 - skipped LED
+
+ P2.0 - skipped, PB3
+ P2.1 - skipped PB4
+
+ INPUT: None
+
+ RETURN: None
+
+ NOTES: None
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void MCU_Init(void)
{
//Disable the Watch Dog timer of the MCU
PCA0MD &= ~0x40;
// Set the clock source of the MCU: 10MHz, using the internal RC osc.
CLKSEL = 0x14;
// Initialize the the IO ports and the cross bar
P0SKIP |= 0xCF; // skip P0.0-3 & 0.6-7
XBR1 |= 0x40; // Enable SPI1 (3 wire mode)
P1MDOUT |= 0x01; // Enable SCK push pull
P1MDOUT |= 0x04; // Enable MOSI push pull
P1SKIP |= 0x08; // skip NSS
P1MDOUT |= 0x08; // Enable NSS push pull
P1SKIP |= 0xF0; // skip LEDs
P1MDOUT |= 0xF0; // Enable LEDS push pull
P2SKIP |= 0x03; // skip PB3 & 4
P2 = 0x03;
SFRPAGE = CONFIG_PAGE;
P1DRV = 0xFD; // MOSI, SCK, NSS, LEDs high current mode
SFRPAGE = LEGACY_PAGE;
XBR2 |= 0x40; // enable Crossbar
// For the SPI communication the hardware peripheral of the MCU is used
//in 3 wires Single Master Mode. The select pin of the radio is controlled
//from software
SPI1CFG = 0x40; // Master SPI, CKPHA=0, CKPOL=0
SPI1CN = 0x00; // 3-wire Single Master, SPI enabled
SPI1CKR = 0x00;
SPI1EN = 1; // Enable SPI interrupt
NSS = 1;
// Turn off the LEDs
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME: void SpiWriteRegister(U8 reg, U8 value)
+
+ DESCRIPTION: This function writes the registers
+
+ INPUT: U8 reg - register address
+ U8 value - value write to register
+
+ RETURN: None
+
+ NOTES: Write uses a Double buffered transfer
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void SpiWriteRegister (U8 reg, U8 value)
{
// Send SPI data using double buffered write
//Select the radio by pulling the nSEL pin to low
NSS = 0;
//write the address of the register into the SPI buffer of the MCU
//(important to set the MSB bit)
SPI1DAT = (reg|0x80); //write data into the SPI register
//wait until the MCU finishes sending the byte
while( SPIF1 == 0);
SPIF1 = 0;
//write the new value of the radio register into the SPI buffer of the MCU
SPI1DAT = value; //write data into the SPI register
//wait until the MCU finishes sending the byte
while( SPIF1 == 0); //wait for sending the data
SPIF1 = 0;
//Deselect the radio by pulling high the nSEL pin
NSS = 1;
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME: U8 SpiReadRegister(U8 reg)
+
+ DESCRIPTION: This function reads the registers
+
+ INPUT: U8 reg - register address
+
+ RETURN: SPI1DAT - the register content
+
+ NOTES: none
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
U8 SpiReadRegister (U8 reg)
{
//Select the radio by pulling the nSEL pin to low
NSS = 0;
//Write the address of the register into the SPI buffer of the MCU
//(important to clear the MSB bit)
SPI1DAT = reg; //write data into the SPI register
//Wait untill the MCU finishes sending the byte
while( SPIF1 == 0);
SPIF1 = 0;
//Write a dummy data byte into the SPI buffer of the MCU. During sending
//this byte the MCU will read the value of the radio register and save it
//in its SPI buffer.
SPI1DAT = 0xFF; //write dummy data into the SPI register
//Wait untill the MCU finishes sending the byte
while( SPIF1 == 0);
SPIF1 = 0;
//Deselect the radio by pulling high the nSEL pin
NSS = 1;
//Read the received radio register value and return with it
return SPI1DAT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -