Добрый день!
На недели купил пару МК Atmel, один из них Attiny85. Сам я новичок среди Atmel, программировал до этого только Arduino. Вот!
Поставил я себе задачу: передавать информацию с помощью с помощью NRF24L01.
Когда использовал 2 комплекта Arduino+NRF24L01, проблем не было!
А вот Attiny85+NRF24L01 и Arduino UNO+NRF24L01 не получается!
Код для Arduino UNO+NRF24L01 (работает как Slave - ждет данные):
Код для Attiny85+NRF24L01(Мастер- передает данные):
Подключение NRF24L01 к Attiny85:
// Reset/Ain0 (D 5) PB5 1|o |8 Vcc
// nRF24L01 CE, Pin3 - Ain3 (D 3) PB3 2| |7 PB2 (D 2) Ain1 - nRF24L01 SCK, pin5
// nRF24L01 CSN, Pin4 - Ain2 (D 4) PB4 3| |6 PB1 (D 1) pwm1 - nRF24L01 MOSI, pin7
// GND 4| |5 PB0 (D 0) pwm0 - nRF24L01 MISO, pin6
// Pinout
// CE - Pin 2 / D3 / nRF3
// CSN - Pin 3 / D4 / nRF4
// GND - Pin 4
// MISO - Pin 5 / D0 / nRF7
// MOSI - Pin 6 / D1 / nRF6
// SCK - Pin 7 / D2 / nRF5
// Vcc - Pin 8 ( 3.3V )
Осциллографом посмотрел на Pin 6 MOSI (Attiny85) передает какие то данные на MISO NRF24L01, только вод UNO ничего не получает!
Помогите плиз!
Заранее спасибо
Раздел: AVR
На недели купил пару МК Atmel, один из них Attiny85. Сам я новичок среди Atmel, программировал до этого только Arduino. Вот!
Поставил я себе задачу: передавать информацию с помощью с помощью NRF24L01.
Когда использовал 2 комплекта Arduino+NRF24L01, проблем не было!
А вот Attiny85+NRF24L01 и Arduino UNO+NRF24L01 не получается!
Код для Arduino UNO+NRF24L01 (работает как Slave - ждет данные):
#include <nrf24l01p.h>
#include <SPI.h>
unsigned long time1=0;
//unsigned long time2=0;
float t1=0;
float t2=0;
// ПЕРЕМЕННЫЕ ДЛЯ РАБОТЫ С NRF24L01
enum
{
SPI_SS_PIN = 10,
NRF_CE_PIN = 9,
NRF_CHANNEL = 120,
NRF_POWER_UP_DELAY = 2,
NRF_PAYLOAD_LENGTH = 16
};
static char payload[NRF_PAYLOAD_LENGTH];
boolean NRFGetData=false;
String NRFStr;
int NRFNumCommand[5];
int NRFCommandCount=0;
boolean First=false;
// ПЕРЕДАЧА ДАННЫХ ПО SERIAL
String TaskStrSerial;
boolean SerialFirst=false;
void setup()
{
NRFStr.reserve(10);
TaskStrSerial.reserve(30);
SPI.begin();
pinMode(SPI_SS_PIN, OUTPUT);
digitalWrite(SPI_SS_PIN, HIGH);
pinMode(NRF_CE_PIN, OUTPUT);
digitalWrite(NRF_CE_PIN, HIGH);
Serial.begin(57600);
time1=millis();
}
void loop()
{
if (millis()-time1>2000)
{
NRFCommandCount=0;
for (int i=0;i<=3;i++) {NRFNumCommand[i]=0;}
uint8_t address_1[5] = { 0x00, 0x00, 0x00, 0x00, 0x01 };
nrf_init(address_1);
GetDataFromNRF(1);
Serial.println(TaskStrSerial);
}
if (millis()-time1<0) time1=0;
}
int GetDataFromNRF(int mode)
{
// Serial.println("Waiting for a packet...");
unsigned long TimerNoPack=millis();
NRFGetData=true;
do {if (millis()-TimerNoPack>10000)
{
// Serial.println("NoPacket!!!");
NRFGetData=false;
break;
}
if (millis()-TimerNoPack<0) TimerNoPack=0;
}
while (!(nrf24l01p_get_irq_flags() & (1 << NRF24L01P_IRQ_RX_DR)));
nrf24l01p_clear_irq_flag(NRF24L01P_IRQ_RX_DR);
if (NRFGetData==true)
{
nrf24l01p_read_rx_payload((uint8_t*)payload);//, sizeof(payload));
Serial.write(payload);
Serial.println("UNO Get Data");
for (int i=0;i<=NRF_PAYLOAD_LENGTH;i++){payload[i]=0;} // Clear payload
}
return 0;
}
void nrf_init(uint8_t *address)
{
delay(100);
nrf24l01p_get_clear_irq_flags();
nrf24l01p_close_pipe(NRF24L01P_ALL);
nrf24l01p_open_pipe(NRF24L01P_PIPE0, false);
// nrf24l01p_set_output_power(NRF24L01P_0DBM);
nrf24l01p_set_crc_mode(NRF24L01P_CRC_16BIT);
nrf24l01p_set_address_width(NRF24L01P_AW_5BYTES);
nrf24l01p_set_address(NRF24L01P_PIPE0, address);
nrf24l01p_set_operation_mode(NRF24L01P_PRX);
nrf24l01p_set_rx_payload_width(NRF24L01P_PIPE0, NRF_PAYLOAD_LENGTH);
nrf24l01p_set_rf_channel(NRF_CHANNEL);
nrf24l01p_set_datarate(NRF24L01P_1MBPS);
nrf24l01p_set_power_mode(NRF24L01P_PWR_UP);
delay(NRF_POWER_UP_DELAY);
Serial.print("Speed = ");
Serial.println(nrf24l01p_get_datarate());
}
void nrf24l01p_spi_ss(nrf24l01p_spi_ss_level_t level)
{digitalWrite(SPI_SS_PIN, (level == NRF24L01P_SPI_SS_LOW ? LOW : HIGH));}
uint8_t nrf24l01p_spi_rw(uint8_t value)
{return SPI.transfer(value);}
Код для Attiny85+NRF24L01(Мастер- передает данные):
#include <nrf24l01p.h>
#include <SPI85.h>
#include <stdio.h>
unsigned long time1=0;
//----------Emulator variable---------
unsigned long TimeToChangeTemp=0;
enum
{
SPI_SS_PIN = PB4,
NRF_CE_PIN = PB3,
NRF_CHANNEL = 120,
NRF_POWER_UP_DELAY = 2,
NRF_PAYLOAD_LENGTH = 16
};
//const
char test_data[12];
void setup()
{
CLKPR = 0x80;
CLKPR = 0x00;
SPI85.begin();
pinMode(SPI_SS_PIN, OUTPUT);
digitalWrite(SPI_SS_PIN, HIGH);
pinMode(NRF_CE_PIN, OUTPUT);
digitalWrite(NRF_CE_PIN, LOW);
uint8_t address[5] = { 0x00, 0x00, 0x00, 0x00, 0x01 };
nrf_init(address);
time1=millis();
TimeToChangeTemp=millis();
t1=18;
}
void loop()
{
if (millis()-TimeToChangeTemp>1000)
{
TimeToChangeTemp=millis();
if (t1==18) t1=20;
else if (t1==20) t1=18;
}
if (millis()-TimeToChangeTemp<0) TimeToChangeTemp=0;
if (millis()-time1>1000)
{
time1=millis();
int t11=int(t1*10);
test_data[0]=t11;
static uint8_t payload[NRF_PAYLOAD_LENGTH];
strcpy((char*)payload, test_data);
nrf24l01p_write_tx_payload(payload, sizeof(payload));
digitalWrite(NRF_CE_PIN, HIGH);
delay(1);
digitalWrite(NRF_CE_PIN, LOW);
do {} while (!(nrf24l01p_get_irq_flags() & (1 << NRF24L01P_IRQ_TX_DS)));
nrf24l01p_clear_irq_flag(NRF24L01P_IRQ_TX_DS);
if (millis()-time1<0) time1=0;
delay(1000);
}
if (millis()-time1<0) time1=0;
}
void nrf_init(uint8_t *address)
{
delay(200);
nrf24l01p_get_clear_irq_flags();
nrf24l01p_close_pipe(NRF24L01P_ALL);
nrf24l01p_open_pipe(NRF24L01P_TX, false);
nrf24l01p_set_rx_payload_width(NRF24L01P_PIPE0, NRF_PAYLOAD_LENGTH);
nrf24l01p_set_crc_mode(NRF24L01P_CRC_16BIT);
nrf24l01p_set_address_width(NRF24L01P_AW_5BYTES);
nrf24l01p_set_address(NRF24L01P_TX, address);
nrf24l01p_set_operation_mode(NRF24L01P_PTX);
nrf24l01p_set_rf_channel(NRF_CHANNEL);
nrf24l01p_set_power_mode(NRF24L01P_PWR_UP);
delay(NRF_POWER_UP_DELAY);
}
void nrf24l01p_spi_ss(nrf24l01p_spi_ss_level_t level)
{
digitalWrite(SPI_SS_PIN, (level == NRF24L01P_SPI_SS_LOW ? LOW : HIGH));
}
uint8_t nrf24l01p_spi_rw(uint8_t value)
{
return SPI85.transfer(value);
}
Подключение NRF24L01 к Attiny85:
// Reset/Ain0 (D 5) PB5 1|o |8 Vcc
// nRF24L01 CE, Pin3 - Ain3 (D 3) PB3 2| |7 PB2 (D 2) Ain1 - nRF24L01 SCK, pin5
// nRF24L01 CSN, Pin4 - Ain2 (D 4) PB4 3| |6 PB1 (D 1) pwm1 - nRF24L01 MOSI, pin7
// GND 4| |5 PB0 (D 0) pwm0 - nRF24L01 MISO, pin6
// Pinout
// CE - Pin 2 / D3 / nRF3
// CSN - Pin 3 / D4 / nRF4
// GND - Pin 4
// MISO - Pin 5 / D0 / nRF7
// MOSI - Pin 6 / D1 / nRF6
// SCK - Pin 7 / D2 / nRF5
// Vcc - Pin 8 ( 3.3V )
Осциллографом посмотрел на Pin 6 MOSI (Attiny85) передает какие то данные на MISO NRF24L01, только вод UNO ничего не получает!
Помогите плиз!
Заранее спасибо
Раздел: AVR