![]() |
|
Tài trợ cho PIC Vietnam |
Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#46 |
PIC Bang chủ
|
Hình như em vẫn chưa đọc cái app note mà Thanh Hà gửi thì phải
![]() Em đọc kỹ lại đi xem cách nó xử lý 32 byte được truyền tới như thế nào? Nếu không cần nACK mà xử lý luôn liệu có được không? Câu trả lời cho câu hỏi của em nằm trong đó ![]() Chúc vui.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#47 |
PIC Bang chủ
|
Hòa, em viết phần giao tiếp I2C giữa thiết bị 5V và 3.3V vào chỗ này.
Vấn đề đặt ra, lúc trước đáng lẽ có trong báo cáo của Linh, nhưng lâu quá F không để ý, vì Linh ngưng đề tài giữa chừng. Đó là làm thế nào để giao tiếp I2C giữa thiết bị chuẩn 5V và thiết bị chuẩn 3.3V, 2.5V... Nguyên tắc I2C đến đây coi như là xong, nhưng trong một mạng I2C, thì làm thế nào để kết nối được giữa các thiết bị có chuẩn điện áp khác nhau. Đây là câu hỏi mở rộng tiếp theo ở phần i2c này. Phạm Thái Hòa sẽ chủ trì phần này, các bạn tiếp tục nghiên cứu và thảo luận về I2C nhé. Chúc vui.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#48 |
Nhập môn đệ tử
Tham gia ngày: Jan 2007
Bài gửi: 3
: |
Hi mọi người,
Thấy câu hỏi này hay nên vagabond cung tham gia trả lời phát. Đúng là ngày nay, việc kết nối các khối linh kiện có các mức điện áp khác nhau ngày càng nhiều. Đặc biệt là giữa mức 3.3V và 5V. Trở lại câu hỏi trên, do mình quen sử dụng các IC chuyên dụng nên tạm thời không xét đến các giải pháp khác. Các bạn có thể sử dụng IC 74LVXC4245 để chuyển đổi mức điện áp 3.3-5V. IC này cũng cho phép xác định chiều vào/ra của tín hiệu. IC này sẽ được cấp 2 nguồn áp tham chiếu là 5V và 3.3V. Chú ý: theo sơ đồ dưới đây, ta cần phải có thêm 2 tín hiệu để điều khiển chiều ra/vào của tín hiệu ở các ngõ A và B. ![]() Các ngõ A tương ứng với mức điện áp logic 1 là 4.5-5.5V Các ngõ B tương ứng với mức điện áp logic 1 là 2.7-5.5V Hai chân ~OE và T/~R cho phép điều khiển tín hiệu đi theo chiều A->B hay B->A hay ở trạng thái HighZ. Mức điện áp điều khiển hai chân này chấp nhận mức logic 1 là 3.3 hay 5V đều được. Xét trường hợp mạng I2C sẽ có mức logic chuẩn là 5V (hoặc 3.3V) cho toàn mạng và các khối linh kiện có mức logic khác 5V sẽ dùng IC tương thích mức logic. Ta có thể kết nối nhiều khối linh kiện có các mức logic khác nhau trên cùng một mạng I2C. Bây giờ, ta xét hoạt động của mạng I2C 5V bao gồm một khối linh kiện 3.3V và khối linh kiện 5V. ![]() Khi Master muốn liên lạc với Slave: Slave phải điều khiển IC tương thích điện áp sao cho chiều tín hiệu đi từ A->B (tức là tín hiệu có mức logic 1 từ 5V sẽ chuyển thành 3.3V). Khi Slave muốn liên lạc với Master, hai chân của IC tương thích điện áp phải được điều khiển để chiều tín hiệu đi từ B->A (tức là tín hiệu có mức logic 1 từ 3.3V sẽ chuyển thành 5V). Tóm lại việc điều khiển 2 chân ~OE và T/~R của IC tương thích điện áp sẽ do Slave chịu trách nhiệm. Trong ví dụ này, ta đưa thẳng chân ~OE xuống đất và chỉ điều khiển chân T/~R (các bạn coi lại bảng sự thật). Mạng I2C 3.3V hoàn toàn tương tự như trên. Master và Slave có thể đổi vị trí cho nhau. Túm lại lần nữa: - Các bạn có thể kiểm các IC tương thích điện áp có số ngõ ra vào tương ứng với số lượng tín hiệu cần chuyển đổi mức logic. Riêng IC tương thích điện áp chỉ có 2 ngõ ra vào thì mình chưa tìm thấy. - Đây là một giải pháp an toàn và nhanh, nhất là khi phải làm việc với các mức điện áp khác nhau. - Tuy nhiên, bù lại bạn phải tốn thêm chỗ cho IC, làm tăng diện tích boar (linh kiện dán CMS vẫn tốn chỗ), phải sử dụng thêm 2 nguồn điện áp, và phải thêm ít nhất là 1 đường tín hiệu để điều khiển chiều A<->B. - Và một điểm lợi nữa khi cần thiết, bạn có thể cách li hoàn toàn các khối linh kiện với trạng thái HighZ ra khỏi bus I2C (nhưng lại phải tốn thêm tín hiệu điều khiển ~OE). Có thể có còn các cách khác nữa (diod Zener để ghim điện áp…) nhưng mình … hehehe nhường cho các bạn. Mình chỉ khoái làm việc với các IC chuyên dụng sẵn thôi. thay đổi nội dung bởi: vagabond, 06-01-2007 lúc 07:44 AM. |
![]() |
![]() |
![]() |
#49 | |
Nhập môn đệ tử
Tham gia ngày: Oct 2005
Bài gửi: 5
: |
Trích:
|
|
![]() |
![]() |
![]() |
#50 |
Nhập môn đệ tử
Tham gia ngày: Dec 2005
Bài gửi: 10
: |
chắc bác sửa thế nào ý chứ, em copy về, mô phỏng thấy chạy ngon re. nhưng em làm 1 con master, 4 con slaver thì thôi rồi, tịt ngỏm luôn. bận quá, chẳng co thời gian nghiên cứu nữa. Vậy nên em làm theo cách khác. vẫn chủ đề là 1 M giao tiếp với vài S. hôm qua làm xong rồi. CCS có cái hay là làm giao tiếp cực mạnh.
em lấy ví dụ: 1 Master có thể có nhiều Slaver giao tiếp qua RS232 ( thậm chí giao lưu văn nghệ với nhau chỉ có 1 "đường tơ" cả GND là 2. em chỉ thử dc có 150m thôi vì ko có dây(ko khuếch đại, đệm chốt gì. PIN-2-PIN)) em sẽ về nghiên cứu thêm cái thằng I2C và SPI. công nhận hay thật
__________________
"Ai nắm được tri thức trước sẽ là người đi trước" PICAT="Programmable Intelligent Computer in Auto Technology" Không biết thông tin này có giúp gì được cho các bạn không: PICAT- Thông tin giáo dục, công nghệ & công nghiệp |
![]() |
![]() |
![]() |
#51 |
Nhập môn đệ tử
Tham gia ngày: Oct 2006
Bài gửi: 3
: |
Hỏi về I2C
Chào các bạn, mình mới lần đầu giao tiếp I2C dùng C để giao tiếp giữa 2 pic 16f877a, nên gặp nhiều vấn đề, hôm trước mình có tải chương trình của Hoàn về chạy thử nhưng không được, hi vọng Hoàn, các anh và các bạn cho mình một chương trình mẫu đơn giản có cả chạy mô phỏng bằng Proteus chính xác,rất cám ơn. Email của mình: quanghuy12c4@yahoo.com. Chúc tât cả vui!
|
![]() |
![]() |
![]() |
#52 | |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 51
: |
Trích:
Mình đã kiểm tra lại chương trình và test trên Protues 6.9 SP5 thấy nó chạy vẫn OK kô có vấn đề gì (Mạch chỉ dùng 1 con Master và 1 con Slave) Ngoài mình cũng sử dụng chương trình này để test trực tiếp lên phần cứng và cũng OK Bạn thử kiểm tra lại mạch coi có nối 2 con điện trở 2.2k ở 2 chân SCL và SDA chưa; tần số dao động dùng đúng chưa ... Chúc vui hoanf |
|
![]() |
![]() |
![]() |
#53 |
Đệ tử 5 túi
Tham gia ngày: Oct 2005
Bài gửi: 117
: |
- Trong giao tiếp I2C thì các bạn nên chú ý trong việc sử dụng mạng giao tiếp giữa các IC này với nhau. Trước tôi đã làm giao tiếp với MS là 877A, 6 slave là 18F4331 để điều khiển rồi, chạy khá tốt. Nếu bạn nào làm mà không giao tiếp được thì cần kiểm tra lại khai báo về I2C (cho soft viết bằng CCS thôi nhé), đảm bảo phải giống nhau ở cả Master và Slave, tất nhiên với Slave có thêm phần khai báo địa chỉ.
- Hàm i2c_isr_state() này chỉ có với phiên bản CCS mới (từ 249), nên nếu bạn nào dùng bản cũ sẽ thấy báo lỗi. - Trường hợp khai báo đúng mà vẫn không giao tiếp được thì cần kiểm tra lại đường giao tiếp I2C (chân SDA và SCL của PIC có thể bị hỏng, cái này tôi đã gặp mấy lần, và khi thử cho giao tiếp với DS1307 hay 24Cxx thì thấy ko đc, thay IC khác hay lái chân SDA, SCL sang chân khác thì lại OK) , vì vậy khi bạ n đã làm đúng các thủ tục mà đọc vẫn thấy 0xFF thì xem lại. - Vì giao tiếp I2C là onboard nên tôi cũng chưa thử kéo dài đường bus. Để giao tiếp với các thiết bị 3V3, tôi thấy có thể dùng mach phân áp trở cũng tạm đc, nếu bạn nào đã làm AVR giao tiếp với thẻ MMC sẽ thấy sơ đồ mạch đó( http://www.captain.at/electronic-atmega-mmc.php ) - Cái hay của CCS là sẽ tự sinh mã I2C nếu HW ko hỗ trợ, do đó ta có thể tùy biến lái các chân tín hiệu này đến một chân bất kỳ, cả SPI cũng vậy. Chúc thành công.
__________________
CallerID, Ethernet-RS232, PICWEB, Cảnh báo BTS Giải pháp toàn diện giám sát - điều khiển từ xa qua GSM/Internet 0988006696 http://linhnc308.blogspot.com linhnc308@gmail.com |
![]() |
![]() |
![]() |
#54 |
Nhập môn đệ tử
Tham gia ngày: Oct 2006
Bài gửi: 3
: |
Mình cảm ơn các bạn rất nhiều, mình đã làm được rồi, mình viết chương trình đơn giản thôi, chỉ dùng Master điều khiển 1 Slave hiển thị LCD và chạy tốt. Cho mình hỏi ngoài luồng một tí, mình đang làm đề tài điều khiển từ xa qua mạng điện thoại, cũng đã tham khảo datasheet và một số tài liệu nhưng chưa thành công, bạn nào có tài liệu cho mình xin, đặc biệt là cái khoản điều khiển con MT8880, đề tài mình gần hết hạn rồi, đang lo lắm, hi vọng được sự giúp đở. Bye,chúc tất cả vui !
|
![]() |
![]() |
![]() |
#55 |
Đệ tử 1 túi
Tham gia ngày: Apr 2007
Bài gửi: 11
: |
![]() Chào các cao thủ , em có bài tập lớn về mạng I2C , trong đó có
2 master( 2 con Pic) , vậy có huynh nào biết rõ về phần này chỉ đệ với. Đệ thắc mắc như sau: Trong I2C có 7 bit địa chỉ , vậy có 128 thiết bị. Vậy địa chỉ cho 2 con master này mình chọn thế nào? và viết khai báo trong CCSC như thế nào? Code:
#use i2c(master, sda=PIN_C4, scl=PIN_C3) của master trong mạng ? Theo như bài tập của đệ thì tại 1 thời điểm chỉ có 1 con Pic là master , con còn lại là slave , vậy đệ phải làm sao để con kia biết nó là slave tại thời điểm đó ? Có phải nó dùng i2c_isr_state () để đọc ko ạ? Đệ mới học về I2C , còn ngu dại , mong các huynh chỉ giáo ạ. |
![]() |
![]() |
![]() |
#56 |
Đệ tử 1 túi
Tham gia ngày: May 2007
Bài gửi: 15
: |
Xin cho đóng góp chút công sức nhé.
namqn: bạn nên đưa link đến post đã chứa file được upload, thay vì upload thêm lần nữa. http://www.picvietnam.com/forum//sho...=8624#post8624 thay đổi nội dung bởi: namqn, 12-05-2007 lúc 06:50 PM. |
![]() |
![]() |
![]() |
#57 |
Đệ tử 4 túi
|
oa giao tiếp I2C hay thiệt đó.
Từ sưa đến j mình chỉ làm nội bộ trong 1 con Chíp chưa thử giao tiếp với bên ngoài theo các chuẩn có sẵn. Ok mình sẽ nghiên cứu về cái này rồi post ý kiến lên sau. ![]() |
![]() |
![]() |
![]() |
#58 |
Đệ tử 1 túi
Tham gia ngày: Mar 2006
Bài gửi: 11
: |
Thế giới số hay thật
|
![]() |
![]() |
![]() |
#59 |
Nhập môn đệ tử
Tham gia ngày: Nov 2006
Bài gửi: 2
: |
CCS C viet nhu vay sao mo phong protues khong thay duoc....
Mình đang viết I2C kết nối PIC 16F877A voi DS1307 bằng CCS C. bien dich thi khog thay bao loi nhung vao mo phong thi khong thay duoc j het. Các Bác giúp mình với. Code minh co dinh kem...thanhks!!!
|
![]() |
![]() |
![]() |
#60 |
Đệ tử 3 túi
Tham gia ngày: Jul 2005
Bài gửi: 51
: |
đệ thấy trong các phần khai báo của các master ko có ghi địa chỉ
của master trong mạng ? Theo như bài tập của đệ thì tại 1 thời điểm chỉ có 1 con Pic là master , con còn lại là slave , vậy đệ phải làm sao để con kia biết nó là slave tại thời điểm đó ? Có phải nó dùng i2c_isr_state () để đọc ko ạ? Master thì cần địa chỉ làm gì? Vua thì ai mà chả biết là vua, trừ khi có vua 1, vua 2 cùng 1 vương quốc, lúc đó thì đánh nhau là cái chắc rồi. Bạn thử dùng cách này thử xem. Khi cần Pic làm master thì khai báo dòng #use i2c(master, sda=PIN_C4, scl=PIN_C3, force_hw) ngay trước cau lệnh master còn khi cần là slave thì khai bao: #use i2c(slave, sda=PIN_C4, scl=PIN_C3, address=..., force_hw) ngay trước cau lệnh slave Mình thấy trong CSS có sử dụng cách này để thay đổi chân truyền RS232 tại thời điểm cần thiết nhưng chưa thử với I2C |
![]() |
![]() |
![]() |
|
|