GIAO TIẾP I2C (PHẦN 3)

0
54

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

MASTER

Thiết lập ở chế độ master (master mode)

MULTI_MASTER

Thiết lập ở chế độ multi_master  (multi_master mode)

SLAVE

Thiết lập ở chế độ slave mode

SCL=pin

Chỉ định chân SCL  (pin là bit địa chỉ)

SDA=pin

Chỉ định chân SDA (pin là bit địa chỉ)

ADDRESS=nn

Chỉ định địa chỉ slave mode

FAST

Sử dụng tốc độ truyền nhanh (Fast)

FAST=nnnnnn

Thiết lập tốc độ là nnnnnn hz

SLOW

Sử dụng tốc độ truyền chậm.

RESTART_WDT

Khởi động WDT trong khi chờ thực thị I2C_READ

FORCE_HW

Bắt buộc sử dụng phần cứng khi giao tiếp (Khối module phần cứng I2C)

FORCE_SW

Bắt buộc sử dụng phần mềm khi giao tiếp (Tự tạo mã giả lập bằng phần mềm do CCS tự sinh code)

NOFLOAT_HIGH

Does not allow signals to float high, signals are driven from low to high

SMBUS

Bus được sử dụng không phải là I2C bus, nhưng gần giống.

STREAM=id

Gán một tên nhận dạng đến cổng I2C này. Tên nhận dạng này có thể sử dụng trong các hàm giống i2c_read hoặc i2c_write.

NO_STRETCH

Do not allow clock streaching

MASK=nn

Thiết lập một mặt nạ địa chỉ cho các phần có hỗ trợ

Ví dụ: #use I2C(slave,sda=PIN_C4,scl=PIN_C3, address=0xa0, FORCE_HW, mask=0xDF)

I2C1

Thay vì sử dụng SCL= và SDA= đây thiết lập chân giao tiếp tương ứng với module I2C thứ nhất.

I2C2

 

Thay vì sử dụng SCL= và SDA= đây thiết lập chân giao tiếp tương ứng với module I2C thứ hai

NOINIT Không thực hiện khởi tạo khối ngoại vi I2C, chỉ khởi tạo khi khi sử dụng lệnh I2C_INIT() khi chạy chương trình.

Có một vài chíp cho phép

DATA_HOLD

No ACK is sent until I2C_READ is called for data bytes (slave only)

ADDRESS_HOLD

No ACK is sent until I2C_read is called for the address byte (slave only)

SDA_HOLD

Min of 300ns holdtime on SDA a from SCL goes low

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.

0 BÌNH LUẬN

Gửi phản hồi