Lập trình C cho hệ thống nhúng (P4- Giao tiếp I2C trong V850E)
Bài đăng này đã không được cập nhật trong 3 năm
1.I2C là gì
Đầu năm 1980 Phillips đã phát triển một chuẩn giao tiếp nối tiếp 2 dây được gọi là I2C. I2C là tên viết tắt của cụm từ Inter-Intergrated Circuit. Đây là đường Bus giao tiếp giữa các IC với nhau. Bus I2C được sử dụng làm bus giao tiếp ngoại vi cho rất nhiều loại IC khác nhau như các loại Vi điều khiển 8051, PIC, AVR, ARM... chip nhớ như: RAM tĩnh (Static Ram), EEPROM, bộ chuyển đổi tương tự số (ADC), số tương tự(DAC), IC điểu khiển LCD, LED...
2.Nguyên lý hoạt động
I2C sử dụng hai đường truyền tín hiệu:
- Một đường xung nhịp đồng hồ(SCL) chỉ do Master phát đi ( thông thường ở 100kHz và 400kHz. Mức cao nhất là 1Mhz và 3.4MHz).
- Một đường dữ liệu(SDA) theo 2 hướng. Có rất nhiều thiết bị có thể cùng được kết nối vào một bus I2C, tuy nhiên sẽ không xảy ra chuyện nhầm lẫn giữa các thiết bị, bởi mỗi thiết bị sẽ được nhận ra bởỉ một địa chỉ duy nhất với một quan hệ chủ/tớ tồn tại trong suốt thời gian kết nối. Mỗi thiết bị có thể hoạt động như là thiết bị nhận hoặc truyền dữ liệu hay có thể vừa truyền vừa nhận. Hoạt động truyền hay nhận còn tùy thuộc vào việc thiết bị đó là chủ (master) hãy tớ (slave).
I2C sử dụng gói Two Wire Interface (TWI)để truyền dữ liệu, một gói truyền TWI sẽ chứa
- Một điều kiên Start gói tin
- Một packet địa chỉ bao gồm(Chỉ thị Read/Write + Slave acknowledge)
- Một hoặc nhiều data packets
- Một điều kiện để Stop gói tin
Một điều kiên Start gói tin Một điều kiện Start gói tin sẽ được Master khởi tạo quá trình truyền dữ liệu.Ở giữa điều kiện start và stop thì bus truyền thông sẽ luôn ở trạng thái bận để tránh một thiết bị master nào đó tạo điều kiện Start . Một điều kiện Start gói tin sẽ được báo hiệu bằng cạnh xuống của SDA , trong khi SCL sẽ vẫn ở mức high.
*Một packet địa chỉ * Một packet địa chỉ sẽ gồm 9 bits(MSB first), trong đó có 7 bits sẽ chứa địa chỉ slave mà master muốn tiến hành truyền thông, 1 bit điều khiển read/write được thiết lập bởi master nhằm xác định chức năng read or write to slave , và cuối cùng là 1 acknowledge bit được thiết lập bởi slave với mục đích báo cho master biết slave đã ở trạng thái sẵn sàng truyền thông hay chưa.
Data packet Data packet sẽ gồm 9bits(MSB first), trong đó có 1 byte dữ liệu và 1 bit acknowledge Trong suốt quá trình truyền thông thì Master tạo SCL và nhận acknowledges Acknowledge (ACK) : bit 9 sẽ ở trạng thái LOW Not Acknowledge (NACK): bit 9 sẽ ở trạng thái HIGH
Một điều kiên Stop gói tin Một điều kiện Stop gói tin sẽ được Master tạo ra để báo hiệu kết thúc quá trình truyền dữ liệu. Một điều kiện Stop gói tin sẽ được báo hiệu bằng cạnh lên của SDA , trong khi SCL sẽ vẫn ở mức high.
3. Sử dụng I2C với micro controller V850
- Khởi tạo khối I2C trong V850 Để sử dụng được khối I2C thì chúng ta phải tiến hành khởi tạo, để các pin trên VĐK sẽ được đảm bảo thực hiện đúng các chức năng của bus SDA và SCL. Dưới đây là chỉ là một flowchart và chương trình mẫu để các bạn tham khảo , vì vậy sẽ có nhưng giá trị thiết lập mà các bạn chưa thể hiểu được ngay, mà cần phải tham khảo manual V850 để nắm được rõ hơn.
#define CI2C_IICX 0b00000000 /* | fxx/8 | On | fxx/192 | 32.00MHz to 64.00MHz | | */
#define CI2C_IICCL 0b00001100 /* |(IICOCKS=12H)| | | | | */
#define CI2C_IICOCKS 0b00010010 /* | | | | | | */
#define I2C_IICRSV IICRSV0 /* bit 0 : Communication reserve function disable bit: Disable (1) */
#define I2C_STCEN STCEN0 /* bit 1 : Initial start enable trigger: Enable operation (1) */
#define I2C_IICC IICC0 /* IIC control register */
#define CI2C_IICC_INI 0b10011100 /* Initial setting for slave (interrupt at stop condition detection: On)*/
void I2cInit( void )
{
/* Set SDA and SCL I/O */
/* Specification of alternate function for pins P31 and P30 */
PFC3 = 0x03; /* +-------+-------+-------+----------------------------------------+ */
PFCE3 = 0x00; /* | PMC31 | PFCE3 | PFC31 | Specification of alternate function pin for P31 | */
PMC3 = 0x03; /* +-------+-------+-------+----------------------------------------+ */
/* | 1 | 0 | 1 | SDA I/O | */
/* +-------+-------+-------+----------------------------------------+ */
/* | PMC31 | PFCE3 | PFC31 | Specification of alternate function for pin P30 | */
/* +-------+-------+-------+----------------------------------------+ */
/* | 1 | 0 | 1 | SCL I/O | */
/* +-------+-------+-------+----------------------------------------+ */
I2C_IICE = 0; /* Stop operation (IICE0=0) */
/*-- Transfer clock setting --*/
I2C_IICX = CI2C_IICX; /* Function expansion register */
I2C_IICCL = (( I2C_IICCL & 0x0d ) | CI2C_IICCL); /* IIC clock selection register */
I2C_IICOCKS = CI2C_IICOCKS; /* IICOPS clock selection register */
/*-- Disable communication reservation --*/
I2C_IICRSV = 1;
I2C_STCEN = 0;
/*-- Initialize I2C operation --*/
I2C_IICC = CI2C_IICC_INI;
#if defined(__I2C_MASTER__)
I2cStopCondition();
#endif
}
- Điều kiện Stop gói tin
/*******************************************************************************************************
; I2C bus stop condition transmission processing
;-------------------------------------------------------------------------------------------------------
; [I N] -
; [OUT] -
;******************************************************************************************************/
#define I2C_SPT SPT0 /* bit 0: Stop condition trigger: Generate (1) */
void I2cStopCondition( void )
{
/*-- Stop condition setting --*/
I2C_SPT = 1;
}
- Điều kiện Start gói tin
#define I2C_IICBSY IICBSY0 /* bit 6 :<R> IIC bus status flag: Bus communicating (1) */
#define I2C_STT STT0 /* bit 1: Start condition trigger: Generate (1) */
/*******************************************************************************************************
; I2C bus start condition transmission processing
;-------------------------------------------------------------------------------------------------------
; [I N] -
; [OUT] 0: Success, 1: Fail (busy status)
;******************************************************************************************************/
unsigned char I2cStartCondition( void )
{
if( !I2C_IICBSY ){
/* Bus release status */
/*-- Start condition setting --*/
I2C_STT = 1;
return ( RESULT_OK );
}
return ( RESULT_BUSY );
}
Những function ở trên là những function cơ bản nhất để một khối I2C có thể hoạt động được và dĩ nhiên chúng ta cần phải viết thêm những function khác để sử dụng các function ở trên, cũng như thiết lập data truyền và nhận cho một khối I2C. Hy vọng những thông tin trên sẽ hữu ích cho các bạn khi bắt đầu tìm hiểu về cách thức hoạt động của I2C trong một VĐK.
All rights reserved