<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Testing connection between atmega32 and nRF24L01 isn&amp;#39;t working</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/36932/testing-connection-between-atmega32-and-nrf24l01-isn-t-working</link><description>I am trying to interface an atmega32 with an nRF24L01. I am trying to communicate between two nRF&amp;#39;s. But before proceeding to that, I set out to test the SPI connection between the atmega and nRF. 
 
 
 This is the nRF24L01.h header file: 
 
 
 
 This</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 31 Jul 2018 08:13:43 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/36932/testing-connection-between-atmega32-and-nrf24l01-isn-t-working" /><item><title>RE: Testing connection between atmega32 and nRF24L01 isn't working</title><link>https://devzone.nordicsemi.com/thread/142078?ContentTypeID=1</link><pubDate>Tue, 31 Jul 2018 08:13:43 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a54d232f-116a-430a-8071-ced82acf6168</guid><dc:creator>ketiljo</dc:creator><description>&lt;p&gt;You need to use a linear regulator for the power supply for both the AVR and the nRF24L01+. A resistor divider will give you a voltage that varies with the current draw.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Testing connection between atmega32 and nRF24L01 isn't working</title><link>https://devzone.nordicsemi.com/thread/141737?ContentTypeID=1</link><pubDate>Fri, 27 Jul 2018 15:01:50 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0fea2a32-13e1-4ce3-bf0f-a63149754ee7</guid><dc:creator>Robur_131</dc:creator><description>&lt;p&gt;Please see the updated code. Somehow I can&amp;#39;t edit the original post.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;/*
 * nRF Transmitter.c
 *
 * Created: 27-Jul-18 7:40:11 PM
 * Author : DELL
 */ 

#define F_CPU 1e6
#include &amp;lt;avr/io.h&amp;gt;
#include &amp;lt;util/delay.h&amp;gt;
#include &amp;quot;nRF24L01.h&amp;quot;

#define MOSI PB5
#define SCK PB7
#define CSN PB4 /* CSN == SS */
#define CE PD7 /* Chip Enable */

#define READ 0
#define WRITE 1

/* SPI - to communicate between Master MCU and Slave nRF */

void initSPI(){
	/* Set MOSI , SCK , CSN and CE as output */
	DDRB |= (1 &amp;lt; MOSI) | (1 &amp;lt;&amp;lt; SCK) | (1 &amp;lt;&amp;lt; CSN);
	DDRD |= (1 &amp;lt;&amp;lt; CE);

	/* SPI Control Register */
	/* Enable SPI and set the MCU as master */
	/* SPI clock rate = f_osc / 4 ; SPR0 = 0 and SPR1 = 0 */
	SPCR |= (1 &amp;lt;&amp;lt; SPE) | (1 &amp;lt;&amp;lt; MSTR);

	/* CSN or SS is active low, as we&amp;#39;ll not send anything to nRF yet, we&amp;#39;re making it high */
	PORTB |= (1 &amp;lt;&amp;lt; CSN);
	/* Making CE low, nothing to transmit or receive yet */
	PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; CE);
}

/* SPI Transmit &amp;amp; Receive Module */
/* Communication between MCU and nRF */

unsigned char SPITransceiver(unsigned char data){
	SPDR = data; // load data in SPDR to start transmission
	while(!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Transmit data until the SPIF flag is set
	return SPDR; // return the received data
}

/* Read the status of a register */

uint8_t getRegister(uint8_t reg){
	_delay_us(10);
	PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; CSN); // making CSN or SS low, nRF starts to listen for command, MCU will send command to slave nRF
	_delay_us(10);
	SPITransceiver(R_REGISTER + reg); // send a command to nRF to read a register (reg)
	_delay_us(10);
	reg = SPITransceiver(NOP); // send dummy byte to nRF and save the contents of the register &amp;quot;reg&amp;quot;
	_delay_us(10);
	PORTB |= (1 &amp;lt;&amp;lt; CSN); // make CSN or SS high to stop communicating with nRF
	return reg;
}

uint8_t* WriteToNrf(uint8_t readOrWrite,uint8_t reg,uint8_t* valArr,uint8_t arrSize){
	if(readOrWrite == WRITE){
		reg = W_REGISTER + reg;
	}

	static uint8_t ret[32]; // array to be returned

	_delay_us(10);
	PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; CSN);
	_delay_us(10);
	SPITransceiver(reg); // send command to nRF whether to read or write
	_delay_us(10);

	for(int i = 0 ; i &amp;lt; arrSize ; i++){
		if(readOrWrite == READ &amp;amp;&amp;amp; reg != W_TX_PAYLOAD){
			ret[i] = SPITransceiver(NOP);
		} else{
			SPITransceiver(valArr[i]);
		}
		_delay_us(10);
	}

	PORTB |= (1 &amp;lt;&amp;lt; CSN);

	return ret;
}

void nrf24L01_init(void)
{
	_delay_ms(100);	//allow radio to reach power down if shut down
	
	uint8_t val[5];	//en array av integers som skickar v&amp;#228;rden till WriteToNrf-funktionen

	//EN_AA - (auto-acknowledgements) - Transmittern f&amp;#229;r svar av recivern att packetet kommit fram, grymt!!! (beh&amp;#246;ver endast vara enablad p&amp;#229; Transmittern!)
	//Kr&amp;#228;ver att Transmittern &amp;#228;ven har satt SAMMA RF_Adress p&amp;#229; sin mottagarkanal nedan ex: RX_ADDR_P0 = TX_ADDR
	val[0]=0x01;	//ger f&amp;#246;rsta integern i arrayen &amp;quot;val&amp;quot; ett v&amp;#228;rde: 0x01=EN_AA p&amp;#229; pipe P0.
	WriteToNrf(W, EN_AA, val, 1);	//W=ska skriva/&amp;#228;ndra n&amp;#229;t i nrfen, EN_AA=vilket register ska &amp;#228;ndras, val=en array med 1 till 32 v&amp;#228;rden  som ska skrivas till registret, 1=antal v&amp;#228;rden som ska l&amp;#228;sas ur &amp;quot;val&amp;quot; arrayen.
	
	//SETUP_RETR (the setup for &amp;quot;EN_AA&amp;quot;)
	val[0]=0x2F;	//0b0010 00011 &amp;quot;2&amp;quot; sets it up to 750uS delay between every retry (at least 500us at 250kbps and if payload &amp;gt;5bytes in 1Mbps, and if payload &amp;gt;15byte in 2Mbps) &amp;quot;F&amp;quot; is number of retries (1-15, now 15)
	WriteToNrf(W, SETUP_RETR, val, 1);
	
	//V&amp;#228;ljer vilken/vilka datapipes (0-5) som ska vara ig&amp;#229;ng.
	val[0]=0x01;
	WriteToNrf(W, EN_RXADDR, val, 1); //enable data pipe 0

	//RF_Adress width setup (hur m&amp;#229;nga byte ska RF_Adressen best&amp;#229; av? 1-5 bytes) (5bytes s&amp;#228;krare d&amp;#229; det finns st&amp;#246;rningar men l&amp;#229;ngsammare data&amp;#246;verf&amp;#246;ring) 5addr-32data-5addr-32data....
	val[0]=0x03;
	WriteToNrf(W, SETUP_AW, val, 1); //0b0000 00011 motsvarar 5byte RF_Adress

	//RF channel setup - v&amp;#228;ljer frekvens 2,400-2,527GHz 1MHz/steg
	val[0]=0x01;
	WriteToNrf(W, RF_CH, val, 1); //RF channel registry 0b0000 0001 = 2,401GHz (samma p&amp;#229; TX &amp;#229; RX)

	//RF setup	- v&amp;#228;ljer effekt och &amp;#246;verf&amp;#246;ringshastighet
	val[0]=0x07;
	WriteToNrf(W, RF_SETUP, val, 1); //00000111 bit 3=&amp;quot;0&amp;quot; ger l&amp;#228;gre &amp;#246;verf&amp;#246;ringshastighet 1Mbps=L&amp;#228;ngre r&amp;#228;ckvidd, bit 2-1 ger effektl&amp;#228;ge h&amp;#246;g (-0dB) (&amp;quot;11&amp;quot;=(-18dB) ger l&amp;#228;gre effekt =str&amp;#246;msn&amp;#229;lare men l&amp;#228;gre range)

	//RX RF_Adress setup 5 byte - v&amp;#228;ljer RF_Adressen p&amp;#229; Recivern (M&amp;#229;ste ges samma RF_Adress om Transmittern har EN_AA p&amp;#229;slaget!!!)
	int i;
	for(i=0; i&amp;lt;5; i++)
	{
		val[i]=0x12;	//RF channel registry 0b10101011 x 5 - skriver samma RF_Adress 5ggr f&amp;#246;r att f&amp;#229; en l&amp;#228;tt och s&amp;#228;ker RF_Adress (samma p&amp;#229; transmitterns chip!!!)
	}
	WriteToNrf(W, RX_ADDR_P0, val, 5); //0b0010 1010 write registry - eftersom vi valde pipe 0 i &amp;quot;EN_RXADDR&amp;quot; ovan, ger vi RF_Adressen till denna pipe. (kan ge olika RF_Adresser till olika pipes och d&amp;#228;rmed lyssna p&amp;#229; olika transmittrar)
	
	//TX RF_Adress setup 5 byte -  v&amp;#228;ljer RF_Adressen p&amp;#229; Transmittern (kan kommenteras bort p&amp;#229; en &amp;quot;ren&amp;quot; Reciver)
	//int i; //&amp;#229;teranv&amp;#228;nder f&amp;#246;reg&amp;#229;ende i...
	for(i=0; i&amp;lt;5; i++)
	{
		val[i]=0x12;	//RF channel registry 0b10111100 x 5 - skriver samma RF_Adress 5ggr f&amp;#246;r att f&amp;#229; en l&amp;#228;tt och s&amp;#228;ker RF_Adress (samma p&amp;#229; Reciverns chip och p&amp;#229; RX-RF_Adressen ovan om EN_AA enablats!!!)
	}
	WriteToNrf(W, TX_ADDR, val, 5);

	// payload width setup - Hur m&amp;#229;nga byte ska skickas per s&amp;#228;ndning? 1-32byte
	val[0]=3;		//&amp;quot;0b0000 0001&amp;quot;=1 byte per 5byte RF_Adress  (kan v&amp;#228;lja upp till &amp;quot;0b00100000&amp;quot;=32byte/5byte RF_Adress) (definierat h&amp;#246;gst uppe i global variabel!)
	WriteToNrf(W, RX_PW_P0, val, 1);
	
	//CONFIG reg setup - Nu &amp;#228;r allt inst&amp;#228;llt, boota upp nrf&amp;#39;en och g&amp;#246;r den antingen Transmitter lr Reciver
	val[0]=0x1E;  //0b0000 1110 config registry	bit &amp;quot;1&amp;quot;:1=power up,  bit &amp;quot;0&amp;quot;:0=transmitter (bit &amp;quot;0&amp;quot;:1=Reciver) (bit &amp;quot;4&amp;quot;:1=&amp;gt;mask_Max_RT,dvs IRQ-vektorn reagerar inte om s&amp;#228;ndningen misslyckades.
	WriteToNrf(W, CONFIG, val, 1);

	//device need 1.5ms to reach standby mode
	_delay_ms(100);

	//sei();
}


int main(void)
{
	initSPI();
	nrf24L01_init();
	DDRA = 0xFF;
	/*
	uint8_t valArr[5];
	valArr[0] = 0x03; // PWR_UP = 1 and PRIM_RX = 1
	WriteToNRF(WRITE,CONFIG,valArr,1);
	uint8_t conf = getRegister(CONFIG);
	*/
	
    while (1)
    {
		PORTA = 0x04;
		_delay_ms(1000);
		PORTA = 0x00;
		_delay_ms(1000);
		
 		if(getRegister(CONFIG) == 0x1E){
 			PORTA = 0x01;
 			_delay_ms(1000);
 			PORTA = 0x00;
 			_delay_ms(1000);	
 		}
    }
}&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>