- Fri Sep 07, 2007 8:54 am
#34794
The following program for the Microchip C18 compiler based on the software SPI function posted here recently might be useful for testing that your SPI interface to the nRF24L01 is working:
Leon
Code: Select all
Run the program under the MPLAB debugger with the data array displayed in the Watch window; you should see the values written to the TX_ADDRESS register read back correctly.
/*
** test.c
** SPI test program for PIC18F4520 and nRF24L01
*/
#include <p18f4520.h>
//function prototypes
unsigned char spi_Send_Read(unsigned char);
// Defines
#define SPI_SCK LATCbits.LATC3 // Clock pin, PORTC pin 3
#define SPI_SO LATCbits.LATC5 // Serial output pin, PORTC pin 5
#define SPI_SI PORTCbits.RC4 // Serial input pin, PORTC pin 4
#define SPI_CSN LATCbits.LATC2 // CSN output pin, PORTC pin 2
#define SPI_CE LATCbits.LATC1 // CE output pin, PORTC pin 1
#define SPI_IRQ PORTBbits.RB0 // IRQ input pin, PORTB pin 0
#define SPI_SCALE 4 // postscaling of signal
// Macros
#define nop() _asm nop _endasm
void main(void)
{
unsigned char status = 0;
unsigned char data[5];
PORTA = 0x00;
ADCON1 = 0x0F; // set up PORTA to be digital I/Os
TRISA = 0x00; // set up all PORTA pins to be digital outputs
TRISCbits.TRISC3 = 0; // SDO output
TRISCbits.TRISC5 = 0; // SCK output
TRISCbits.TRISC2 = 0; // CSN output
TRISCbits.TRISC1 = 0; // CE output
SPI_CSN = 1; // CSN high
SPI_SCK = 0; // SCK low
SPI_CE = 0; // CE low
nop();
//write TX_ADDRESS register
SPI_CSN = 0; //CSN low
spi_Send_Read(0x30);
spi_Send_Read(0x11);
spi_Send_Read(0x22);
spi_Send_Read(0x33);
spi_Send_Read(0x44);
spi_Send_Read(0x55);
SPI_CSN = 1; //CSN high
//read TX_ADDRESS register
SPI_CSN = 0; //CSN low
status = spi_Send_Read(0x10);
data[0] = spi_Send_Read(0x00);
data[1] = spi_Send_Read(0x00);
data[2] = spi_Send_Read(0x00);
data[3] = spi_Send_Read(0x00);
data[4] = spi_Send_Read(0x00);
SPI_CSN = 1; //CSN high
while (1)
;
}
/********************************************************************
* Function: unsigned char spi_Send_Read(unsigned char bytein)
*
* Description: This function outputs a single byte onto the
* SPI bus, MSb first. And it gets the response.
*******************************************************************/
unsigned char spi_Send_Read(unsigned char bytein)
{
static unsigned char i; // Loop counter
static unsigned char j; // Delay counter
unsigned char byteout = 0; // return bit
SPI_SCK = 0; // Ensure SCK is low
for (i = 0; i < 8; i++) // Loop through each bit
{
if (bytein & 0x80) // Check if next outbit is a 1
{
SPI_SO = 1; // If a 1, pull SO high
}
else
{
SPI_SO = 0; // If a 0, pull SO low
}
byteout = byteout << 1; // Shift outbyte left for next bit
if (SPI_SI == 1) // Check if next inbit is a 1
{
byteout |= 0x01; // If a 1, set next bit to 1
}
else
{
byteout &= 0xFE; // If a 0, set next bit to 0
}
SPI_SCK = 1; // Bring SCK high to latch bit
for (j = 0; j < SPI_SCALE; j++)
{
nop(); // Avoid violating Thi
}
SPI_SCK = 0; // Bring SCK low for next bit
bytein = bytein << 1; // Shift byte left for next bit
}
return byteout;
} // end of spi_Send_Read(...)
Leon
Leon Heller
G1HSM
G1HSM