Cấu hình chuẩn giao tiếp I2C trong trình biên dịch CCS
1.#USE I2C (options)
Cú pháp: |
#USE I2C (options)
|
||||||||||||||||||||||||||||||||||||||||||||||
Các phần tử: |
Options có thể là các lệnh sau
Có một vài chíp cho phép
|
||||||||||||||||||||||||||||||||||||||||||||||
Mục đích: |
CCS cung cấp hỗ trợ giao tiếp I2C dựa trên phần cứng và trên phần mềm (đối với các vi điều khiển không hỗ trợ module giao tiếp i2C bằng phần cứng), Tham khảo datasheet đối với dòng vi điều khiển mà bạn muốn lập trình, không phải tất cả Pic đều hổ trợ module phần cứng đối với giao tiếp I2C. Thư viện I2C chứa đựng các hàm để thực hiện giao tiếp. #USE I2C ảnh hưởng đến các hàm I2C_START, I2C_STOP, I2C_READ, I2C_WRITE and I2C_POLL đến khi #USE I2C tiếp theo được khai báo. Các hàm được tạo bằng phần mềm ngoại trừ khi bạn khai báo FORCE_HW. |
||||||||||||||||||||||||||||||||||||||||||||||
Ví dụ: |
#use I2C(master, sda=PIN_B0, scl=PIN_B1) #use I2C(slave,sda=PIN_C4,scl=PIN_C3, address=0xa0, FORCE_HW) #use I2C(master, scl=PIN_B0, sda=PIN_B1, fast=450000) //Thiết lập tốc độ là 450 KBSP |
Code:
#use I2C(slave,sda=PIN_C4,scl=PIN_C3, address=0xa0, FORCE_HW, mask=0xDF)
The chip should then accept address 0xA0, and also address 0x80, and interrupt on each. The slave handler is going to have to read the address byte, and verify which address it is responding to.
The masking works as:
0b10100000 address
0b11011111 mask
0b10x00000 addresses that will match
2.i2c_poll( )
Hàm này trả về True nếu trong bộ đệm nhận có byte dữ liệu. Nếu hàm này trả về true . Ta gọi hàm I2C_read() sẽ trả về 1 byte dữ liệu đã nhận được.
Ví dụ:
if(i2c-poll()) buffer [index]=i2c-read();// đọc dữ liệu |
3. i2c_speed( )
Cú pháp:
i2c_speed (baud)
i2c_speed (stream, baud)
Trong đó:
baud: là số bit trên giây
stream:tên nhận dạng đến cổng I2C được thiết lập trong phần #use I2C
Trả về: Hàm này không có tham số trả về
Chức năng:
Hàm này sẽ thay đổi tốc độ I2C khi chạy chương trình. Nó chỉ làm việc khi đang sử dụng module i2c bằng phần cứng.
Ví dụ:
I2C_Speed (400000);
4. i2c_start( )
Cú pháp:
i2c_start()
i2c_start(stream)
i2c_start(stream, restart)
Trong đó:
stream:tên nhận dạng đến cổng I2C được thiết lập trong phần #use I2C
Tạo một điều kiện start khi thiết bị đóng vai trò marter mode
Ví dụ:
i2c_start(); i2c_write(0xa0); // Địa chỉ của thiết bị muốn giao tiếp i2c_write(address); // Viết dữ liệu đến thiết bị i2c_start(); // Restart i2c_write(0xa1); // Thay đổi hướng truyền data=i2c_read(0); // Nhận dữ liệu từ thiết bị i2c_stop(); |
5. i2c_stop( )
Hàm này tạo một điều kiện stop khi thiết bị là master
6. i2c_slaveaddr( )
Hàm này thiết lập địa chỉ khi thiết bị là slave
7. i2c_read( )
Cú pháp:
data = i2c_read();
data = i2c_read(ack);
data = i2c_read(stream, ack);
Trong đó:
ack là tùy chọn, mặc định là 1
ack=0 : không có chỉ thị ack
ack=1: Có chỉ thị ack
ack=2: Chỉ sử dụng với slave
stream:tên nhận dạng đến cổng I2C được thiết lập trong phần #use I2C
Ví dụ:
i2c_start();
i2c_write(0xa1);
data1 = i2c_read(TRUE);
data2 = i2c_read(FALSE);
i2c_stop();
i2c_write( )
Cú pháp:
i2c_write (data)
i2c_write (stream, data)
data: dữ liệu 8 bit
Stream: tên định danh cổng I2C được định nghĩa trong phần #use I2C
Tham số trả về: hàm này trả về bit ACK.
0 nghĩa là ACK
1 Nghĩa là Non-ACK
2: nghĩa là có xung đột khi sử dụng ở chế độ đa chủ.
Hàm này sẽ không trả về một ACK nếu sử dụng trong chế độ slave
Gửi 1 byte quan bus I2C. Trong chế độ master hàm này sẽ tạo xung clock với dữ liệu và trong chế độ slave nó sẽ chò xung clock từ master. Hàm này không cung cấp chức năng timeout. Hàm này trả về bit ACK.