पर I2C का उपयोग करने से पढ़ने/लिखना मैं चिप को पढ़ने/लिखने की कोशिश कर रहा हूं जो पता 0b 1010 011
पर I2C बस पर कनेक्ट है।लिनक्स
जब मैं 3 बाइट (डेटा पता 2 बाइट्स, + डेटा एक बाइट) लिखने के लिए कोशिश कर रहा हूँ, मैं एक कर्नेल संदेश ([12406.360000] i2c-adapter i2c-0: sendbytes: NAK bailout.
), और साथ ही लिखने लाभ प्राप्त = 3. देखें नीचे दिए गए कोड:
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
int file;
char filename[20];
int addr = 0x53; // 0b1010011; /* The I2C address */
uint16_t dataAddr = 0x1234;
uint8_t val = 0x5c;
uint8_t buf[3];
sprintf(filename,"/dev/i2c-%d",0);
if ((file = open(filename,O_RDWR)) < 0)
exit(1);
if (ioctl(file,I2C_SLAVE,addr) < 0)
exit(2);
buf[0] = dataAddr >> 8;
buf[1] = dataAddr & 0xff;
buf[2] = val;
if (write(file, buf, 3) != 3)
exit(3);
...
हालांकि जब मैं 2 बाइट्स लिखते हैं, फिर एक और बाइट लिखते हैं, मेरे पास कोई कर्नेल त्रुटि मिलती है, लेकिन जब ज्ञानकोष से पढ़ने की कोशिश कर रहा, मैं हमेशा मिलता है वापस 0. यहाँ ज्ञानकोष से पढ़ने के लिए कोड है:
uint8_t val;
if ((file = open(filename,O_RDWR)) < 0)
exit(1);
if (ioctl(file,I2C_SLAVE,addr) < 0)
exit(2);
if (write(file, &dataAddr, 2) != 2) {
exit(3);
if (read(file, &val, 1) != 1) {
exit(3);
कोई भी फ़ंक्शन कोई त्रुटि मान नहीं देता है, और मैंने इसे भी आजमाया है:
#include <linux/i2c.h>
struct i2c_rdwr_ioctl_data work_queue;
struct i2c_msg msg[2];
uint8_t ret;
work_queue.nmsgs = 2;
work_queue.msgs = msg;
work_queue.msgs[0].addr = addr;
work_queue.msgs[0].len = 2;
work_queue.msgs[0].flags = 0;
work_queue.msgs[0].buf = &dataAddr;
work_queue.msgs[1].addr = addr;
work_queue.msgs[1].len = 1;
work_queue.msgs[1].flags = I2C_M_RD;
work_queue.msgs[1].buf = &ret;
if (ioctl(file,I2C_RDWR,&work_queue) < 0)
exit(3);
जो भी सफल होता है, लेकिन हमेशा 0 देता है। क्या यह हार्डवेयर समस्या का संकेत देता है, या क्या मैं कुछ गलत कर रहा हूं?
क्या लिनक्स पर I2C से FM24CL64-GTR के लिए कोई FRAM ड्राइवर हैं, और API क्या होगा? कोई भी लिंक उपयोगी होगा।
आपको बाहर निकलने() के बिना (अंडरस्कोर के बिना) का उपयोग करना चाहिए, _exit() नहीं। _exit() libc को ठीक से बंद नहीं करता है। –
धन्यवाद, यह सिर्फ हार्डवेयर लेट-अप परीक्षण कोड है, लेकिन फिर भी आपकी प्रतिक्रिया के लिए धन्यवाद। – TheSeeker