2009-02-02 22 views
10

पर 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 क्या होगा? कोई भी लिंक उपयोगी होगा।

+0

आपको बाहर निकलने() के बिना (अंडरस्कोर के बिना) का उपयोग करना चाहिए, _exit() नहीं। _exit() libc को ठीक से बंद नहीं करता है। –

+0

धन्यवाद, यह सिर्फ हार्डवेयर लेट-अप परीक्षण कोड है, लेकिन फिर भी आपकी प्रतिक्रिया के लिए धन्यवाद। – TheSeeker

उत्तर

6

एन ए के एक बड़ा संकेत था: WriteProtect पिन था बाहरी रूप से खींचा गया, और उसे जमीन पर ले जाना पड़ा, उसके बाद डेटा-बाइट्स के बाद पते का एक भी लिखना सफल रहा (पहला कोड सेगमेंट)।

पते को पढ़ने के लिए पहले लिखा जा सकता है (लिखने() का उपयोग करके), और फिर उस पते से अनुक्रमिक डेटा पढ़ा जा सकता है।

5

मुझे उस विशेष डिवाइस के साथ अनुभव नहीं है, लेकिन हमारे अनुभव में कई आई 2 सी उपकरणों में "क्विर्क" हैं जिनके लिए काम के आसपास की आवश्यकता होती है, आमतौर पर ड्राइवर स्तर से ऊपर।

हम लिनक्स के साथ लिनक्स (सीईएलएनयूक्स) और आई 2 सी डिवाइस डिवाइस ड्राइवर का भी उपयोग करते हैं। लेकिन हमारे एप्लिकेशन कोड में एक गैर-तुच्छ I2C मॉड्यूल भी है जिसमें हमारे पास अनुभव किए गए सभी विभिन्न उपकरणों से निपटने के लिए सभी कार्य-आसपास की खुफिया जानकारी शामिल है।

इसके अलावा, जब I2C के मुद्दों से निपटने, मैं अक्सर लगता है कि मैं अपने आप को स्रोत कल्पना के साथ फिर से परिचित कराने के लिए की जरूरत है:

http://www.nxp.com/acrobat_download/literature/9398/39340011.pdf

के साथ-साथ एक सभ्य आस्टसीलस्कप के उपयोग।

http://www.nxp.com/documents/user_manual/UM10204.pdf और पाठ्यक्रम विकिपीडिया की:

गुड लक,

लिंक से ऊपर मर चुका है, यहाँ कुछ अन्य लिंक हैं http://en.wikipedia.org/wiki/I%C2%B2C

+0

मैं आज सुबह ऑसीलोस्कोप से शुरू करूंगा, और काम करने के बाद मेरे निष्कर्ष पोस्ट करूंगा, जब तक किसी और के पास लिनक्स के लिए FRAM I2C ड्राइवर नहीं है, लेकिन मुझे कोई नहीं मिला। – TheSeeker

2

ध्यान दें कि struct i2c_rdwr_ioctl_data और struct i2c_msg (यानी, अंतिम कोड भाग जो आपने दिया है) का उपयोग करने की विधि अन्य लोगों की तुलना में अधिक कुशल है, क्योंकि उस विधि के साथ आप I2c की दोहराई गई प्रारंभ सुविधा निष्पादित करते हैं।

इसका मतलब है कि आप STA-WRITE-STO -> STA-READ-<data>...-STO संक्रमण से बचें, क्योंकि आपका संचार STA-WRITE-RS-READ-<data>...STO (RS = बार-बार शुरू हो जाएगा)। तो, आपको एक अनावश्यक STO-STA क्षणिक बचाता है।

नहीं

है कि यह समय में एक बहुत अलग है, लेकिन अगर यह आवश्यक नहीं है, यही कारण है कि इस पर खोने ...

बस मेरे 2 सीटी।

सर्वश्रेष्ठ आरजीडीएस,

0

आपको कुछ गलतियां थीं!

ic का पता हेक्स में Ax है, x कुछ भी लेकिन 4 ऊपरी बिट्स हो सकता है A=1010 होना चाहिए !!!