Giao tiếp I2C
1 Attachment(s)
Bài báo cáo này do Nguyễn Chí Linh thực hiện trong thời gian làm mod của picvietnam, nhưng không hiểu sao vẫn chưa được đăng. Hôm nay thấy bên dientuvietnam thảo luận về vấn đề này, cho nên mới tìm lại bài báo cáo này và gửi lên.
Chúc vui |
Em post 1 bài ngoài vấn để kỹ thuật nhé. Chữ I2C đọc là gì nhỉ? Nguyên gốc của nó là IIC hoặc viết I2C nhưng số 2 viết nhỏ phía trên giống số mũ. Có người đọc là "Ai chu xi" (I 2 C đánh vần tiếng Anh :D), em nghĩ đúng phải đọc là "Double I C", tương tự như IEEE đọc là (I triple E).
Nhưng em thích đọc là I 2 C (đánh vần tiếng Việt :D). Không biết mọi người đọc như thế nào nhỉ? |
Trích:
Thân, |
Trích:
Còn "Eye Triple E" là cách đọc được ghi chú trực tiếp trên trang ieee.org. Ở Pháp thì nó lại đọc (anh viết tiếng Việt) "Y troa dsơ" Cũng đồng nghĩa với I và 3 chữ E. Do vậy, từ nay về sau, thống nhất trên PICVietnam, chúng ta đọc I2C là "Eye two See", chứ không đọc "Eye Square See" (đề phòng trường hợp cần voice chat, sẽ có một ngày đại hội picvietnam online), còn khi viết thì viết I2C cho nhanh, chứ không nên viết rất mất công viết công thức Latex. Chúc vui. |
Mình dùng lệnh I2C trong CCS có hiệu quả ko ?!
Vì mình đang viết thử I2C. Thấy chương trình mẫu(EX_Slave) trong CCS C mô phỏng bộ nhớ ngoài 24xx chuẩn, nên nạp chạy thử thấy: viết từ Master (Ctr Mater lấy ví dụ: EX_EXTEE) ít nhất là 4 lần mới được, còn đọc thì lại ko được. Xem tài liệu thì thấy có rất nhiều bit bẫy tình huống I2C, nhưng các lệnh về I2C trong CCS thì đơn giản và ít. Vậy, có vấn đề gì không.
Code:
#include <16F876A.h> |
Có ai quan tâm vấn đề I2C trong CCS, cho Hà hỏi 1 chút:
i2c_isr_state() hình như không có trong V 3.227. Version này chỉ có các lệnh I2C cho 16F877A là: i2c_start(), i2c_stop(), i2c_read(),i2c_write(), i2c_poll(). Có phải vậy không. Nếu vậy, mình phải tự tạo i2c_irs_state(). Có phải vậy ko?!. Vì trong Help V4.0,có nói đến i2c_isr_state(), còn Help V3.227 Hà đang dùng thì ko thấy nói đến. Có ai rành I2C, chỉ giáo giùm chút ít kinh nghiệm.Xin rất cảm ơn!! |
Chào Hà.
Tui cũng đang mò làm I2C trên CCS đây. Hà nói là phiên bản 3.227 kô có i2c_irs_state(). Vậy sao Hà kô tải V3.249 về làm. Mình hi vọng tui cả Hà sẽ cùng nghiên cúu vấn đề này. Chào hoanf |
Hà đang tìm đường link để tải Version khác cao hơn: V3.242 thì sáng tới giờ ko thấy gì. Vậy, mình tìm thử V3.249 xem sao.
Bạn biết link V3.249 thì hướng dẫn Hà với !! Rất cảm ơn !!! Thanhha |
|
1 Attachment(s)
Hà vừa thử chtr I2c: Master 16F877A, Slave 16F876A, cùng giao tiếp PC để kiểm tra dữ liệu đọc và viết của Master và Slave> Thấy rất tốt ! I2C hay thiệt! Nhiêm vụ bây giờ mình chỉ tạo giao thức dữ liệu, còn chtr service plug&play slave thì thấy hơi khó! Nhưng mònh cố gắn viết thử. Cảm ơn Hoanf, mọi người rất nhiều !!
Code:
********************************************** Code:
********************************************** Phần mạch điện có File đính kèm : |
Anh đề nghị em post thêm sơ đồ mạch nguyên lý đi kèm. Thực ra không có gì phức tạp cả, chỉ vì bài viết mà chỉ có code không thôi thì nó không sinh động. Hơn nữa, người sau đọc vào không có hình ảnh đi kèm, nhiều khi người ta không hiểu nổi và ngại đọc. Chỉ cần có một cái hình vào, thì bài viết sẽ sinh động hơn nhiều.
Chúc vui. |
:d
Chào các bạn và Hà.
Mình mới viết được chương trình giao tiếp I2C đơn giản dùng các hàm của CCS. Mời các bạn xem và cho nhận xét Master: truyền dữ liệu cho Slave. Mỗi lần truyền 1 byte. Code:
#include <16F877A.H> Slave thì chỉ tiến hành kiểm tra có phải Master truyền hay kô. Nếu truyền thì nhận byte dữ liệu và hiển thị lên port_B: Code:
#include <16F877A.H> hoanf |
Alo
Chào các bạn!!
Mình gặp trục trặc khi đọc dữ liệu từ Slave về. Đây là đoạn code sử dụng cho 2 con PIC 18F877A. Master: Yêu cầu Slave nhận dữ liệu liên tục (cách nhau 500ms) và nó sẽ hiển thị giá trị nhận được lên Port_b. Dùng leds để quan sát. Code:
#include <16F877A.H> Code:
#include <16F877A.H> |
Theo Hà nghĩ, ở Master, khi mình đọc cũng phải chờ xung ACK từ Slave thì chtr ko bị rối.
Bạn thử thêm một chtr con chờ Bus trong <2401.c>: Code:
//**************code thêm vào********************* Thân mến !! |
Các em nhớ đặt chương trình trong thẻ [code]...[/code ] (nhớ viết liền lại)
Như vậy thì mọi người sẽ đọc dễ hơn, và nếu code dài quá thì nó cũng thu gọn lại trong một khung cố định. Ngoài ra, code cũng có thụt ra thụt vào rõ ràng như trong đoạn code mà tụi em copy. Chú ý điều này khi viết bài. Chúc vui. Hoanf, và ThanhHa, như anh nói, giúp anh post một cái hình mạch nguyên lý giao tiếp đúng như trong cái đề tài mà tụi em đang thảo luận, để mọi người dễ theo dõi. Thanks muchie. |
Chào mọi người và Hà.
Mình làm cho nó chạy được rồi. Mình có một thắc mắc mong Hà và mọi người giải thích dùm. Đó là thông số "FORCE_HW" mà trong phần #use i2c sử dụng Mình cho rằng thông số này chỉ được áp dụng khi ta quy định chân của I2C đúng theo chân của PIC quy đinh (đối với Pic hỗ trợ I2C). khi mình áp thông số này thì CCS sẽ biên dịch chương trình sao cho phù hơp với cấu hình phần cứng mà PIC hỗ trợ. Còn nếu kô áp thông số này lên thì nó sẽ thực hiện giao thức I2C hoàn toàn bằng phần mềm. Và còn một lệnh mình chưa rõ đó là : I2C_POLL() Mong Hà và các bạn góp ý. Thân hoanf |
Trích:
Anh chỉ nói đơn giản thế này, nó bao gồm chuẩn về kết nối, có nghĩa là các header em dùng để cắm vào, nôm na là chuẩn cơ khí, chuẩn về đường dây (các loại dây để đảm bảo tín hiệu truyền)..chuẩn cáp, chuẩn thứ ba nôm na là chuẩn về điện là các chuẩn về điện áp, dòng điện, và chuẩn thứ tư là chuẩn logic, chuẩn này ảnh hưởng đến số lượng dây truyền, phương thức truyền nhận, tín hiệu trên các dây... Nói chung, một chuẩn truyền bao gồm các chuẩn như vậy. Anh dùng từ ngữ không chính xác lắm, tụi em có thể tra cứu lại các từ ngữ tiếng Anh, anh chỉ cố gắng giải thích theo nghĩa đơn giản nhất thôi. Như vậy, bây giờ khi em kết nối về mặt cơ khí (với I2C là hàn vào board, hoặc hai dây cắm vào), chuẩn cable là đường mạch in hoặc dây 3000 đồng/sợi... hehehe... vân vân... Vậy cái cuối cùng, là chuẩn về logic và điện tử. Em thấy rằng, nếu như bây giờ, mình lấy 2 dây nối bất kỳ, nối vào nhau, dùng con PIC, lập trình một chân tạo xung clk, một chân truyền tín hiệu, đưa vào MAX232, thì lập tức em sẽ có được giao tiếp RS232. Cái này em hoàn toàn lập trình được, đối với bất kỳ chân nào, chỉ cần phỏng theo chuẩn logic của RS232 là em có thể lập trình được. Như vậy, người ta gọi cách làm đó là giao tiếp theo chuẩn RS232 bằng phần mềm. Và thực tế là người ta đã làm như vậy. Còn với giao tiếp I2C, thì em thấy nó có khác gì RS232 đâu, nó cũng có thể làm được như vậy bằng phần mềm, chỉ cần lập trình về mặt logic đảm bảo chuẩn truyền của nó. Với con PIC bất kỳ, không hỗ trợ I2C, em hoàn toàn có thể thực hiện giao tiếp I2C bằng phần mềm theo cách trên. Với các con PIC hỗ trợ I2C, em có 2 cách để thực hiện giao tiếp I2C là phần cứng và phần mềm. Thế thì phần cứng, thực ra là người ta thêm vào đó một khối module phần cứng, thay cho cái việc mình viết một đoạn chương trình để chạy, thì cái module đó nó làm thay mình, và nó được đóng gói theo đúng chuẩn. CCS C hỗ trợ hai dạng lập trình. Một dạng là lập trình vài dòng để kích hoạt cái module phần cứng của PIC và chạy giao tiếp bằng phần cứng. Một dạng khác, là nó sẽ tạo ra code để thực hiện cái chuẩn giao tiép đó, gọi là phần mềm. Như vậy, nếu em dùng module phần cứng, bắt buộc, em phải dùng đúng cái chân của nó, vì cái chân đó nó gắn vào module phần cứng I2C của PIC, còn nếu em dùng phần mềm, thì như anh nói, em có thể dùng bất kỳ chân I/O nào, và em chỉ cần định nghĩa nó là chân I/O là xong, em hoàn toàn có thể tự làm chuyện này. Hôm nào rảnh, anh sẽ tìm lại code I2C viết bằng phần mềm để tụi em tham khảo. Anh viết lâu rồi, nên phải tìm lại, không hứa trước sẽ nhanh. Trong khi chờ đợi, cho anh cái hình mạch nguyên lý lên đây đi, coi như là đánh đổi nhé :) Chúc vui |
Cám ơn anh Falleaf!!
Thực ra mô hình của bạn Hà mới phức tạp nên cần sơ đồ. Chứ mô hình của em chỉ có 2 con PIC 16F877A nối với nhau qua các chân I2C chứ chả có gì nên em kô post lên. Nay thấy anh nói vậy thì để em ngồi vẽ post sơ đồ lên. Còn về chương trình em chưa gửi lên được vì đang tiến hành Optimize. Sẽ post cùng sơ đồ luôn :D. Thân hoanf |
1 Attachment(s)
Chào các bạn!!
Cho mình post sơ đồ và code của minh lên đây cho các bạn coi và có gì góp ý cho mình nha. Đây là đoạn code Master: Master truyền một mảng cho Slave và nhận về mảng mà đã chuyển cho Slave để hiển thị lên port_b(kiểm tra hihi...) giống echo. Code:
#include <16F877A.H> Code:
#include <16F877A.H> |
Đơn giản vậy thôi, các em vừa làm xong một bài hướng dẫn I2C khá đầy đủ rồi :)
Thanks muchie |
Trích:
Vậy chắc phải đợi bài hướng dẫn I2C nâng cao của anh Falleaf qua'. Tui em đang đợi chương trình của anh đây. Thân hoanf |
Hi các bạn!
Hôm nay I2C không chay, mình dò 1 buổi, phát hiện điện áp cấp 2 Board Master va Slave không đủ 5V và bị lệch(đã nối mass chung 2 board): Master ->4.9V, Slave -> 4.2V. Các bạn nên kiểm tra dòng, áp mạch khi I2C không chạy với chtr đã chuẩn. Chúc mừng hoanf, bạn đã thành công!! |
Trích:
Ah còn cái vụ nối mass chung là chuối nhất luôn đo'. Làm cho chuẩn I2C từ 2 dây trở thành 3 dây :(. Giờ chỉ còn 1 cách đó là nối đất cả 2 board là thành chuẩn 2 dây. Hix. Ah còn cái zu áp thấp này tui mới thấy đó nha. Đúng là gặp mấy lỗi này thì trời biết. Ông Hà này hay lắm mới tìm ra lỗi này đó. Thân. Cuối tuần vui vẻ nha. hoanf |
Trích:
Con PIC16F84A hình như không có tích hợp chức năng I2C? Nếu như anh không nhớ lầm?! Bắc thang lên hỏi ông trời, ông mà không biết tui mời ông ggô Chúc vui |
À, nếu đang nghiên cứu I2C thì anh nghĩ nhân tiện nên đi cho nó tới nơi tới chốn. Tụi em thử làm cái I2C bằng phần mềm xem, tất nhiên source code thì coi như anh cung cấp rồi :), bằng gợi ý.
Ngoài ra, để động viên tinh thần học tập của tụi em, anh xin tặng mỗi em 1 con PIC (nếu tụi em ở SG, thì ghé cửa hàng STH để chọn bất kỳ con nào có ở cửa hàng mà em muốn). Gửi thông tin cá nhân cho anh, để anh nhắn cho anh Lợi. Hiện tại anh đi rồi nên không thể chuyển phát nhanh cho tụi em được (mỗi lần chuyển tốn tiền, và nếu nhờ Chính chuyển thì tốn tiền của Chính). Anh không biết Hà ở đâu, nhưng hình như Hoàn thì ở HCM và có gặp anh rồi thì phải. Nếu Hà ở nơi khác, Hoàn có thể nhận giúp và chuyển lại cho Hà sau có được không? Tuỳ tụi em quyết định Chúc vui. |
Trích:
Ngoài ra còn có chương trình cho PIC18 viết trong C18, dùng kỹ thuật bit-banging, đã thử nghiệm rồi. Các bạn có thể tìm được nhiều ví dụ tương tự trên net. Thân, |
Trích:
Hoanf có tham gia dự án PID thì phải. Tha hồ mà nhận chip nhẩy. :D. Mấy bạn cứ gửi địa chỉ lên đây, mình sẽ chuyển chip cho. Bạn nào muốn viết code I2C bằng phần mềm, ngôn ngữ ASM, có thể ghé mình, cho mượn tài liệu mà nghiên cứu luôn. Hiểu được cách viết bằng ASM, chuyển code sang C chắc cũng không có vấn đề gì lớn nhẩy. ;) |
Trời ui sao các cụ lão làng nhà ta lai viết giao tiếp bằng ccs không vậy.Tôi thì viết truyền thông I2C bằng cả hai ngôn ngữ luôn ==masterviết bằng CCS và claver viết bằng ASM chạy cực tốt==.MASTER DÙNG 18F452 VÀ CLAVER DUNG 18F4431.HÔM NÀO TUI POST LÊN CHO ANH EM NGHIÊN CỨU CHƠI,hom nay do không đem theo chương trình.
Bác FALLEAF ơi Tôi là thành viên mới vào diễn đàn ghé qua forum này thấy hay nên nhảy vào không biết sau khi post chương trình này lên thì tui được đệ tử mấy túi nhỉ..8-x hehehe.Hỏi thử cho biết thôi chứ không có gì đau Phong độ chỉ là thoáng qua Trình độ mới là vĩnh cửu Chú mèo đihia tái bút thanks |
HI, mấy túi không quan trọng, vì có thể spam thật nhiều sẽ có nhiều túi :). Nhưng điều đó không được khuyến khích trong picvietnam. Ở picvietnam có một cách nhìn hơi lạ một chút với các diễn đàn khác, đó là sự tập trung và làm việc.
Hãy cho những gì bạn muốn lấy. Đó là nguyên tắc vô cùng quan trọng. Chúc vui. |
Bẩm báo PIC bang chủ và các trưởng lão? Như bang chủ đã nói là lên học viết ASM trước rùi chuyển qua các ngôn ngữ khác sẽ dễ. Em thấy cần một tutorial cho I2C bằng ASM vì em mới học nên chỉ biết ASM thui. Các cao thủ ra chiêu bằng C ào ào chẳng hiểu mô tê chi hết á.
Xin cảm ơn. |
Có 2 application notes về master và slave được M cung cấp khá chi tiết, 734, 735 thì phải, không nhớ chính xác là cái nào, bạn có thể tìm hiểu thêm về nó.
Tutorial về I2C bằng MPASM thì Phạm Đức Mạnh đã cung cấp rồi thì phải, bạn tìm lại bài viết của mafd47a. Chúc vui. |
Vâng! Đúng như Bác F nói !! Hà đã load tài liệu ASM về I2C này ở đây:
http://www.microchip.com/stellent/id...t6_NextRow=101 +Tài liệu AN735 nói về Master. +Tài liệu AN734 nói về Slave. Theo Hà nghĩ, mình có thể dùng tài liệu này để tham khảo tự viết lệnh I2C mới trong CCS C thì rất tốt. Chương trình viết hay lắm!! Bạn tham khảo đi ! |
|
Anh oi, em chua hieu ve I2C lam va tren dien dan lai chang thay ai noi ve chuyen nay. Trong giao thuc I2C trong CCS co ham i2c_read(), nhung ham do chi la ham doc tu master truyen xuong slave dung ko a? Cai ma tui em dang can la nhu vay: master truyen xuong 10byte (10byte nay chua gia tri la vi tri muon dieu khien dong co rc), sau do slave se doc 10 byte do va xuat gia tri dieu khien cho tung dong co ung voi tung byte da duoc truyen tu master. Nhung em ko thay ai noi ve chuyen nay va co thac mac nhu sau, anh chi dum em nhe
- Du lieu tu master truyen xuong se vao dau trong slave(eeprom?),neu trong eeprom thi lam sao de con slave co the lay ra va su dung cac gia tri do? |
Trích:
Linh viết bài này có một số vấn đề truyền tải chưa được rõ lắm do cách dùng câu chữ mà thôi. F viết lại đôi chút như sau: trong giao tiếp I2C, có thể có (1 master và 1 slave) hoặc (1master và nhiều slave). Đây là giao thức chuẩn. Tuy nhiên, cải tiến giao thức này một chút, chúng ta sẽ có mạng I2C (nhiều master, mỗi con thay phiên làm master).. Chúng ta chỉ đề cập giao tiếp I2C ở dạng chuẩn, tức là có duy nhất 1 master trong mạng. Khi muốn dữ liệu truyền từ A tới B. Có nhiều trường hợp xảy ra như sau: A là master, B là slave: khi đó A sẽ gửi một loạt dữ liệu có định dạng sẵn (các bạn xem lại định dạng I2C), thì trong định dạng đó có bao gồm mấy thông tin như sau (master muốn đọc hay muốn ghi? địa chỉ của slave là bao nhiêu? master có muốn kiểm tra bằng xung ACK, tức là xung báo đã truyền nhận đầy đủ hay không? và nội dung dữ liệu (nếu master muốn ghi), và địa chỉ thanh ghi của slave (nếu master muốn đọc một thanh ghi nào đó trong slave). Nếu A là slave, thì slave không được quyền muốn. Khi nào master kêu nhận thì phải nhận, khi nào master kêu gửi, thì phải gửi. Slave thì không được quyền muốn. Nếu muốn thì làm nô tì I-Sau-ra :D. Còn nếu cả A và B đều là slave, khi master cần truyền dữ liệu từ A sang B, thì Master phải yêu cầu A gửi cho master, nhận xong, master gửi lại cho B. Như vậy vấn đề học giao tiếp I2C, chỉ đơn giản là học cách định dạng dữ liệu trong frame truyền của I2C (mô tả sơ bộ ở trên), và học cách nối mạng giữa mạng điện áp thấp và điện áp cao (vd: một thiết bị I2C 3.3V, kết nối với thiết bị 5V thì làm thế nào?).. kiểu như vậy thôi là các bạn đã có thể thiết kể rất nhiều ứng dụng với I2C, và làm việc với rất nhiều thiết bị rồi. Chúc vui. |
tức là con tớ hoàn toàn bị động trong trường hợp này sao? Nó không thể nào lấy tí thông tin nào đem bán cho các điệp viên để kiếm chút cháo sao? Buồn vậy! Vậy theo anh làm sao giải quyết bài toán mà tụi em đang gặp phải nhỉ:
Một con chủ truyền 10 byte cho con tớ và con tớ có toàn quyền sử dụng 10 byte này?? anh cho em xin ý kiến nhé |
Trích:
|
Trích:
Em vừa đọc cái SPI, thấy con tớ đọc dữ liệu trong thanh ghi SSPBUF ( được master truyền xuống) sau đó xuất ra port B. file: http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf Nó làm em nghĩ rằng ko biết mình có thể làm tương tự với i2c ko?? cao huynh nào rành i2c cho ý kiến nhé |
Trích:
Các bạn lưu ý rằng, F nói trường hợp nâng cao, thì chúng ta hoàn toàn có quyền sử dụng mạng Multi Master. Khi bạn setup chip ở chế độ Slave, thì nó thụ động. Nhưng hãy thử nghĩ, tôi làm slave cho mạng này, và làm master của một mạng khác, vậy thì có được không? Vì tôi có tới 40 chân chứ không phải 2 chân. Vậy nếu tôi làm master cho một mạng khác, mà trong đó slave của tôi lại là master của cái mạng mà tôi làm slave :). Hoàn toàn được. Nhưng vấn đề nâng cao ở chỗ nữa, nếu làm như vậy, tôi phải tốn 4 dây để làm 2 mạng. Vấn đề trước đây hình như F đặt ra cho Linh, nhưng Linh chưa giải quyết xong, đó là Multi Master trong một mạng dùng 2 dây thôi. Vấn đề này F tiếp tục treo ở đây chờ người giải quyết. Chúc vui. |
Trích:
Chúc vui. |
Múi giờ GMT. Hiện tại là 02:37 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam