View Single Post
Old 22-07-2009, 11:40 AM   #2
rien
Đệ tử 1 túi
 
Tham gia ngày: Sep 2008
Bài gửi: 13
:
Code:
#if defined __PCH__
#byte SSPSTAT = 0xFC7
#byte SSPBUF =  0xFC9
#elif defined __PCM__
#byte SSPSTAT = 0x94
#byte SSPBUF =  0x13
#endif

#bit DA_BIT = SSPSTAT.5
#bit RW_BIT = SSPBUF.0

#inline
int8 my_i2c_isr_state(void)
{
static int8 i2c_state = 0x03;   
int8 retval;
   
if(!DA_BIT)  // If address byte was received
  {
   i2c_state = 0;  // Then clear state.

   if(RW_BIT)      // If it is a Read address
      bit_set(i2c_state, 7);  // Then set bit 7 of state, i.e. i2c_state = 0x80
  }   
 
retval = i2c_state;

i2c_state++;     

return(retval); 
}
Đây là hàm i2c_isr_state() mình lấy từ diễn đàn ccscinfo. Bạn đọc nó thì sẽ hiểu rõ biến state: khi nào state = 1, 2, ....

Ta so sánh giá với 0x80. Theo mình là vì 0x80 = 128 = 256/2. Vì state có độ lớn 1 byte. Do đó vùng giá trị của nó được chia đôi. 1/2byte giá trị là dành cho i2c_write() và 1/2byte giá trị là dành cho i2c_read().
rien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn