PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp USB, CAN, I2C, SPI, USART... (http://www.picvietnam.com/forum/forumdisplay.php?f=45)
-   -   CCS,xin hỏi các lệnh trong giao thức I2C, như là i2c_write(),i2c_read() (http://www.picvietnam.com/forum/showthread.php?t=11885)

chuvanhuu 20-11-2011 01:56 PM

CCS,xin hỏi các lệnh trong giao thức I2C, như là i2c_write(),i2c_read()
 
1 Attachment(s)
chào mọi người, mình mới học lập trình vi điều khiển, hiện tại mới tiếp cận đến truyền thông qua giao thức I2C, mình cũng đọc qua bài viết của anh Linh và các bài viết khác rồi nhưng cũng chưa thấm đc bao nhiêu.
mình lập chủ đề này xin hỏi mọi người có những lệnh nào sử dụng trong giao thức I2C kiểu như là i2c_write(), i2c_read(), .... cách thức hoạt động của nó ra sao, ví dụ như trong chương trình đọc cảm biến TC74 dùng I2C sau đây (bạn mình đưa cho bắt tự nghiên cứu):

Code:

#include <16F877A.H>
#fuses HS, NOWDT, PROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(master, sda=PIN_C4, scl=PIN_C3)        // su dung i2c //master
#include <lcd_lib_4bit.c>

signed int8 nhiet_do();  // doc nhiet do tu TC74

void main()
{
signed int8 temp;

while(1)
  {
  lcd_init(); 
  temp = nhiet_do();
  lcd_putcmd(0x80);
  printf(lcd_putchar," CanSat - CanFly:");
  lcd_putcmd(0xC0);
  printf(lcd_putchar,"  Temp: %d oC",temp);
  printf("Nhiet do do duoc la: %d oC \n\r", temp);
  delay_ms(500);
  }
}


signed int8 nhiet_do()  //doc nhiet do
{
signed int8 t;

i2c_start();        // start
i2c_write(0x9A);    // tc74 address|0
i2c_write(0x00);
i2c_start();        // restart
i2c_write(0x9B);    // tc74 address|1
t = i2c_read(0);    // read + send not ack
i2c_stop();          // stop

return(t);
}



mình không hiểu chỗ i2c_write(0x9A), rồi lại ngay sau đó i2c_write(0x9B), không hiểu hai câu lệnh này hoạt động như thế nào, làm gì
Rất mong mọi người giúp đỡ, cám ơn nhiều!
sau đây là hình mô phỏng trong Proteus

chuvanhuu 21-11-2011 06:40 PM

mình hòm hòm hiểu ra dòng lệnh i2c_write(0x9A) là chuẩn bị gửi dữ liệu đến địa chỉ 1001101, i2c_write(0x90) chắc là viết lên đó dữ liệu 0 (chắc là reset data tại địa chỉ đó)
nhưng giờ thì ko hiểu i2c_write(0x9B), byte của nó là 10011011, có bit cuối là 1 nghĩa là nhận dữ liệu từ TC74 đúng ko ạ, vậy sao lại dùng lệnh i2c_write(0x9B) ở đây, nó mâu thuẫn quá. sau đó, dòng dưới thì mới thấy lệnh i2c_read()
các bác dành chút thời gian chỉ giáo giúp,

tan_truong 23-11-2011 05:05 PM

Ý kiến cá nhân của mình
i2c_write(0x9A); nghĩa là cái địa chỉ của thiết bị là 0x9A
còn lệnh i2c_write(0x9B); là yêu cầu thiết bị(slave) gửi dữ liệu lên cho PIC(master)
thực ra 2 câu lệnh đó bạn có thể thay thế bằng cách này nè
int16 slave_addr;
i2c_write(slave_addr + 1);
mà hông biết bạn đã mô phỏng thành công hay chưa?
Chúc vui

chuvanhuu 24-11-2011 06:33 PM

cám ơn bạn nhé, cái này chạy đc rồi, nhưng không phải mình viết, mình đang học từ đây.
i2c_write(0x9B) là yêu cầu TC74 gửi giữ liệu cho master, mình nghĩ bạn nói đúng,nhưng mình xem dấtheet của cái TC74 này, địa chỉ là 1001101,thêm bit 0 ở cuối là 10011010=0x9A, vậy là cái i2c_write(0x9A) là mater thông báo với slave là sẽ truyền cái gì đó cho slave :|

hungln0189 25-11-2011 12:24 AM

ám ơn bạn nhé, cái này chạy đc rồi, nhưng không phải mình viết, mình đang học từ đây.
i2c_write(0x9B) là yêu cầu TC74 gửi giữ liệu cho master, mình nghĩ bạn nói đúng,nhưng mình xem dấtheet của cái TC74 này, địa chỉ là 1001101,thêm bit 0 ở cuối là 10011010=0x9A, vậy là cái i2c_write(0x9A) là mater thông báo với slave là sẽ truyền cái gì đó cho slave :|


Múi giờ GMT. Hiện tại là 11:32 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam