मैं बीगलबोन ब्लैक के साथ DAC5571 को नियंत्रित करने का प्रयास कर रहा हूं। मेरा कर्नेल संस्करण है:

Linux beaglebone 4.14.108-ti-r137 #1stretch SMP PREEMPT Tue Aug 25 01:48:39 UTC 2020 armv7l GNU/Linux

मैं डीएसी आईसी को आंशिक रूप से नियंत्रित कर सकता हूं। जैसा कि आप यहां देख सकते हैं, आपको 3 बाइट भेजने होंगे; गुलाम का पता, CTRL/MSB और LSB। IC स्लेव एड्रेस बाइट्स और CTRL/MSB को पहचानता है। मैं आउटपुट पिन के आउटपुट को पढ़ और पुष्टि कर सकता हूं। लेकिन जब मैं वोल्टेज मान को धीरे-धीरे वाउट + = 0.05 के रूप में बढ़ाना शुरू करता हूं, तो आउटपुट 0.2, 0.4, 0.6, आदि के रूप में बढ़ता है ...

मैंने अपने आस्टसीलस्कप से जाँच की है और मैं पुष्टि कर सकता हूँ कि तीसरी बाइट 0x00 के रूप में प्रेषित की जा रही है, चाहे उसका वास्तविक मूल्य कुछ भी हो।

यहाँ मेरा स्रोत कोड है:

int DAC5571::writeI2CDeviceByte(int value)
{

  cout << "Starting DAC5571 I2C sensor state write" << endl;

  char namebuf[MAX_BUS];
  snprintf(namebuf, sizeof(namebuf), "/dev/i2c-%d", I2CBus);
  int file;

  if ((file = open(namebuf, O_RDWR)) < 0) {
        cout << "Failed to open DAC5571 Sensor on " << namebuf << " I2C Bus" << endl;
        return(1);
  }

  if (ioctl(file, I2C_SLAVE, I2CAddress) < 0) {
        cout << "I2C_SLAVE address " << I2CAddress << " failed..." << endl;
        return(2);
  }

  int buffer[2];

    buffer[0] = value>>8;
    buffer[1] = value & 0xFF;

    cout << "buffer [0] is " << buffer[0] << endl;
    cout << "buffer [1] is " << buffer[1] << endl;
  if (write(file, buffer, 2) != 2) {
      cout << "Failure to write values to I2C Device address." << endl;
      return(3);
  }
  close(file);
  cout << "Finished DAC5571 I2C sensor state write" << endl;
  return 0;
}

यहाँ कंसोल आउटपुट है:

Starting DAC5571 I2C sensor state write
buffer [0] is 3
buffer [1] is 128
Finished DAC5571 I2C sensor state write

मैंने अपने शोध पर देखा है कि एक हेडर फ़ाइल है जिसे "i2c-core.h" कहा जाता है, लेकिन मैं अपनी परियोजनाओं में शामिल नहीं कर सका जिसमें ब्लॉक राइट फ़ंक्शन है। यकीन नहीं होता कि इससे मेरी स्थिति में मदद मिलेगी।

क्या कोई डेटा के एलएसबी हिस्से को संचारित करने में सक्षम नहीं होने के बारे में मेरी समस्या को हल करने में मेरी मदद कर सकता है?

धन्यवाद।

1
Gurkan 19 जिंदा 2021, 02:01

1 उत्तर

सबसे बढ़िया उत्तर
    int buffer[2];
    buffer[0] = value>>8;
    buffer[1] = value & 0xFF;
    if ( write(file, buffer, 2) != 2) { ... }

buffer के अवयव int प्रकार के होते हैं, जो 4 बाइट लंबे होते हैं। इसलिए जब आप buffer को 2 की लंबाई के साथ लिखते हैं, तो आप 2 बाइट्स लिखते हैं, जो पूर्णांक buffer[0] के पहले दो बाइट्स होते हैं। आपके उदाहरण में buffer[0] 3 है, इसलिए चूंकि यह मशीन छोटी-एंडियन है, इसमें बाइट्स 03 00 00 00 होते हैं और आप 03 00 लिखते हैं।

आप शायद unsigned char buffer[2]; या शायद uint8_t buffer[2]; चाहते हैं, ताकि प्रत्येक तत्व एक बाइट हो।

1
Nate Eldredge 19 जिंदा 2021, 02:46
धन्यवाद नैट, इसे char buffer में बदलने से समस्या हल हो गई।
 – 
Gurkan
19 जिंदा 2021, 02:58
मुझे लगता है कि put_unaligned_be16() (या बल्कि cpu_to_be16() __be16 buffer; के साथ) कम त्रुटि प्रवण है और कम LOCs भी देता है।
 – 
0andriy
20 जिंदा 2021, 22:48
ठीक है, ऐसा लगता है कि उपयोगकर्ता अंतरिक्ष कार्यक्रम है, इसलिए भविष्य के लिए, libi2c i2c-tools से है जो इस सब में मदद करता है।
 – 
0andriy
20 जिंदा 2021, 22:53