мусор на i2c ?

Drunken0Master
Offline
Зарегистрирован: 23.10.2018

Доброго времени суток!

Собственно имеется проблема при работе RPi3 с arduino. На ардуинке висит NRF24L01 для приема данных с передатчика. Потом данные преобразовываются и шлются по i2c в малинку. На малинке задумано написать скрипт которые будет выполняться раз в 15 минут, считывать эти данные с шины в БД, ну а далее все будет показываться на web-морде. Но пока что появилась проблема правильности получения данных.

Код ардуины:


#include <SPI.h>      // библиотека для протокола SPI
#include <nRF24L01.h> // библиотека для nRF24L01+
#include <RF24.h>     // библиотека для радио модуля
#include "printf.h"
#include <Wire.h>

RF24 radio(9,7); // Для MEGA2560 замените на RF24 radio(9,53);
int SLAVE_ADDRESS = 0x4D; // i2c адрес
const uint64_t pipe = 0xF0F0F0F0E1LL; // идентификатор передачи
float data[4]; // данные с приемника
byte data2byte[3]; // массив byte
byte p1,p2; // для давления
int commandCode = 0; // команда от мастера
int presure,p=0;

void setup()
{
  radio.begin();       // включаем радио модуль
  radio.setChannel(9); // выбираем канал (от 0 до 127)
  radio.setDataRate(RF24_1MBPS);  // скорость: RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
  radio.setPALevel(RF24_PA_HIGH); // мощность: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM
  radio.openReadingPipe(1, pipe);    // открываем первую трубу
  radio.startListening();            // начинаем слушать трубу
  //radio.printDetails();
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive(receiveData);
  Wire.onRequest(requestData);
}

void loop() 
{
  if (radio.available())             // проверяем буфер обмена
  {
    radio.read(&data, sizeof(data)); // читаем данные
    delay(500);
    presure=int(data[0]);
    p1 = highByte(presure);
    p2 = lowByte(presure);
    data2byte[1]=byte(data[1]); // емкость батареи передатчика
    data2byte[2]=byte(data[2]); // температура
    data2byte[3]=byte(data[3]); // влажность
  }
}

void requestData()
{
  switch(commandCode)
  {
    case 1:
      Wire.write(data2byte[1]); // емкость батареи
      delay(500);
      break;
    case 2:
      Wire.write(data2byte[2]); // температура
      delay(500);
      break;
    case 3:
      Wire.write(data2byte[3]); // влажность
      delay(500);
      break;
    case 41:
      Wire.write(p1); // старшая часть давления
      break;
    case 42:
      Wire.write(p2); // младшая часть давления
      delay(500);
      break;
    default: break;
  }
}


void receiveData(int iBuffer)
{
  while (Wire.available())
  {
    commandCode = Wire.read();
  }
}

Код на малине:

#

import smbus
import time
bus = smbus.SMBus(1);
address = 0x4d;

def read():
    return bus.read_byte(address)

while True:
    
    command = input (">>>>>  ")
    if command == "1":
        bus.write_byte(address, 0x1)
        C = read()
        print ("Capacity ",C)
    elif command == "2":
        bus.write_byte(address, 0x2)
        T = read()
        print ("Temp ",T)
    elif command == "3":
        bus.write_byte(address, 0x3)
        H = read()
        print ("Humi ", H)
    elif command == "4":
        bus.write_byte(address, 0x29)
        P1 = read()
        time.sleep(1)
        bus.write_byte(address, 0x2A)
        P2 = read()
        P = (P1<<8)|P2
        print ("Press ", P)
    time.sleep(1)
    
    

Код для малины уже 100500 редакции и какими только способами прием не был написан в итоге всегда получал одно и тоже - при склеивании числа был мусор.

Попытался выяснить откуда растут ноги и решил проверить значения по отдельности и вот что вышло - младшая часть всегда приходить стабильно правильная, а вот со старшей творится непонятная вакханалия. При запуске скрипта оно верное, а потом постоянно сыпется 130(????) может иногда появится 0 или правильное значение, но потом все опять по новой

Перечитал кучу мануалов, форумов но так и не смог найти способа как с этим побороться и вообще первопричину ( i2c идут витой парой, все остальное работает без проблем)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Шина I2C подтянута к + питания?

rkit
Offline
Зарегистрирован: 23.11.2016
Drunken0Master
Offline
Зарегистрирован: 23.10.2018

DetSimen пишет:

Шина I2C подтянута к + питания?

да все подтянуто, на линии еще RTC висит, до ардуины еще экран был, все работало без проблем, сейчас проблема при чтении байт давления, причем только одной половины.

 

и при чем тут это? лишь бы вставить? проблема не в порядке, а в приеме сначала правильного значения с появляющимся непонятным мусором. откуда в регистре где хранится старшая часть числа (=2) появляется 130??

Drunken0Master
Offline
Зарегистрирован: 23.10.2018

проблема решена, тему можно закрывать

Olger
Offline
Зарегистрирован: 28.02.2015

а как решена?

Drunken0Master
Offline
Зарегистрирован: 23.10.2018

Olger пишет:

а как решена?

 

 case 41:
      Wire.write(p1); // старшая часть давления
      break;

поставил задержку перед выходом такую же как и в других  выборках и помогло