Thứ Tư, 28 tháng 11, 2018

Bài 7. PIC 18F450 Giao Tiếp I2C

Giới thiệu

  • I2C (Inter Integrated Circuit) là một giao thức master-slave có thể có một master hoặc nhiều master và nhiều slave trong khi SPI chỉ có một master.
  • Nó là một giao thức nối tiếp đồng bộ truyền dữ liệu giữa hai thiết bị.
  • Nó thường được sử dụng để giao tiếp trong khoảng cách ngắn. Đó là giao thức tốc độ chậm so với giao tiếp SPI.
  • Thiết bị I2C có địa chỉ duy nhất 7 bit hoặc 10 bit. Vì vậy, để truy cập các thiết bị này, chủ nhân phải giải quyết chúng bằng địa chỉ 7-bit hoặc 10 bit duy nhất.
  • I2C được sử dụng trong nhiều ứng dụng như đọc RTC (đồng hồ thời gian thực), truy cập bộ nhớ EEPROM bên ngoài. Nó cũng được sử dụng trong các mô-đun cảm biến như con quay hồi chuyển, từ kế, v.v ...
  • Nó còn được gọi là giao thức hai dây giao diện (TWI).
Bus I2C sử dụng 2 dòng để liên lạc:
  1. Serial Clock (SCL): Đây là tín hiệu đồng hồ. Dữ liệu sẽ được gửi đến các thiết bị khác trên sự kiện đánh dấu đồng hồ. Chỉ thiết bị chính mới có quyền kiểm soát dòng SCL này.
  2. Dữ liệu nối tiếp (SDA): Đây là một dòng dữ liệu nối tiếp được sử dụng để gửi dữ liệu theo một trong hai hướng.
Các dòng I2C tổng quát
Các dòng I2C tổng quát

Bus I2C là một cấu hình cống mở có nghĩa là chúng có thể kéo đường tín hiệu tương ứng thấp nhưng không thể lái nó cao. Do đó dòng sẽ đi vào trạng thái chưa biết. Để tránh điều này, kéo điện trở cần phải được kết nối trên chân SCL và SDA.

Chân I2C PIC18F4550

Chân I2C PIC18F4550


Các chân PORTB.0 và PORTB.1 được sử dụng cho giao tiếp I2C dưới dạng SDA và SCL tương ứng.
PIC18F4550 có mô-đun Giao thức Nối tiếp Đồng bộ Chính (Master), bao gồm giao thức I2C.

Đăng ký I2C

Để thiết lập giao tiếp I2C giữa các thiết bị, chúng ta phải cấu hình PIC18F4550. Để làm điều này, PIC18F4550 có các thanh ghi khác nhau như sau
SSPBUF: Bộ đệm truyền / nhận nối tiếp
Trong giao thức I2C, SSPBUF là một thanh ghi dữ liệu được sử dụng để truyền và nhận dữ liệu.
SSPSR: MSSP Shift Đăng ký
Đây là thanh ghi thay đổi được sử dụng để chuyển dữ liệu vào và ra trên dòng SDA. Nó không thể truy cập trực tiếp.
Đăng ký SSPADD: Đăng ký địa chỉ MSSP
Trong chế độ chính:
Thanh ghi SSPADD được sử dụng để quyết định hoặc tạo ra tốc độ baud / bit.
Bây giờ làm thế nào để tính toán giá trị cho tốc độ baud / bit.
I2C Baud Generation
I2C Baud Generation

Tải giá trị được tạo trong thanh ghi SSPADD.
Công thức trên được sử dụng để quyết định tần số đồng hồ I2C.
Ở chế độ Slave:
SSPADD đăng ký giữ địa chỉ của thiết bị nô lệ.

SSPCON1: MSSP Control 1 Đăng ký
Đăng ký PIC18F4550 SSPCON1
Đăng ký PIC18F4550 SSPCON1

Bit 7 - WCOL: Viết va chạm Phát hiện bit
       1 = Đăng ký SSPBUF được viết trong khi vẫn đang truyền từ trước đó.
       0 = Không có va chạm.
Bit 6 - SSPOV: Nhận cờ chỉ báo tràn
       1 = Một byte được nhận trong khi thanh ghi SSPBUF vẫn giữ từ trước đó.
       0 = Không tràn.
Bit 5 - SSPEN: Cổng nối tiếp đồng bộ kích hoạt bit
       1 = Bật cổng nối tiếp và định cấu hình chân SDA và SCL làm chân cổng nối tiếp.
       0 = Vô hiệu hóa Serial Port và cấu hình các chân như GPIO.
Bit 4 - CKP: bit điều khiển phát hành SCK
Ở chế độ nô lệ:
        1 = Đồng hồ phát hành
        0 = Giữ đồng hồ ở mức thấp
Không được sử dụng ở chế độ chính
Bit 3: 0 - SSPM3: SSPM0:
        0110 = Chế độ I2C Slave, địa chỉ 7 bit
        0111 = Chế độ I2C Slave, địa chỉ 10 bit
        1000 = Chế độ chủ I2C, Đồng hồ = FOSC / (4 * (SSPADD + 1))
        1011 = Chế độ chính được điều khiển bằng Firmware I2C
        1110 = Chế độ I2C Slave, địa chỉ 7 bit có chức năng Ngắt bắt đầu và Dừng
        1111 = Chế độ I2C Slave, địa chỉ 10 bit có chức năng Ngắt bắt đầu và Dừng

SSPCON2: MSSP Control 2 Đăng ký
Đăng ký PIC18F4550 SSPCON2
Đăng ký PIC18F4550 SSPCON2

Bit 6 - ACKSTAT: Trạng thái nhận biết bit
            1 = tín hiệu xác nhận không nhận được từ nô lệ
            0 = tín hiệu xác nhận đã nhận được từ nô lệ
Bit 5 - ACKDT: Xác nhận bit dữ liệu
Bit này được sử dụng khi yêu cầu chính đến các thiết bị phụ thuộc để đọc / nhận dữ liệu.
            1 = Không xác nhận cho thiết bị khác ngừng gửi dữ liệu.
            0 = Xác nhận cho thiết bị gửi dữ liệu khác.
Bit 4 - ACKEN: Xác nhận chuỗi bit cho phép
            1 = Bắt đầu xác nhận trình tự trên chân SDA và SCL và truyền dữ liệu ACKDT bit được tự động xóa bằng phần cứng.
            0 = Xác nhận trình tự là vô hiệu hóa hoặc không sử dụng.
Bit 3 - RCEN: Nhận bit Bật
            1 = Bật chế độ nhận cho I2C.
            0 = Tắt chế độ nhận.
Bit 2 - PEN: Stop Condition Bật bit
            1 = Bật điều kiện dừng và tự động xóa bằng phần cứng.
            0 = Điều kiện dừng không hoạt động.
Bit 1 - RSEN: Khởi động lại điều kiện Bật bit
            1 = Bật điều kiện khởi động lặp lại và tự động xóa bằng phần cứng.
            0 = Điều kiện khởi động lặp lại là Nhàn rỗi.
Bit 0 - SEN: Điều kiện khởi động Bật bit
            1 = Bật điều kiện khởi động và tự động xóa bằng phần cứng.
            0 = Điều kiện khởi động không hoạt động.

SSPSTAT: Đăng ký trạng thái MSSP
Đăng ký PIC18F4550 SSPSTAT
Đăng ký PIC18F4550 SSPSTAT

Bit 7 - SMP: Bit điều khiển tốc độ xoay
Trong chế độ Master hoặc Slave:
            1 = Điều khiển tốc độ xoay được tắt cho chế độ tốc độ tiêu chuẩn (100 kHz và 1MHz). 
            0 = Điều khiển tốc độ xoay được kích hoạt cho chế độ tốc độ cao (400 kHz).
Bit 6 - CKE: SMBus Chọn bit
            1 = Bật đầu vào SMBus cụ thể.
            0 = Vô hiệu hóa đầu vào SMBus cụ thể.
Bit 5 - D / A: bit dữ liệu / địa chỉ
Ở chế độ Slave:
            1 = chỉ ra rằng byte cuối cùng đã nhận hoặc truyền là dữ liệu
            0 = cho biết byte cuối cùng đã nhận hoặc truyền là địa chỉ     
Bit 4 - P: Dừng bit
            1 = chỉ ra rằng bit dừng đã được phát hiện cuối cùng
            0 = dừng bit không được phát hiện cuối cùng
Bit 3 - S: bit bắt đầu
            1 = chỉ ra rằng bit bắt đầu đã được phát hiện lần cuối
            0 = bit bắt đầu không được phát hiện lần cuối
Bit 2 - R / W: bit đọc / ghi thông tin
Ở chế độ Slave:
            1 = Đọc
            0 = Viết
Trong chế độ chính:
            1 = Đang truyền
            0 = Đang truyền
Bit 1 - UA: Cập nhật bit địa chỉ.
Nó chỉ được sử dụng cho chế độ nô lệ 10 bit.
            1 = Chỉ ra rằng người dùng cần cập nhật địa chỉ trong thanh ghi SSPADD.
            0 = Địa chỉ không cần phải cập nhật
Bit 0 - BF: Bit trạng thái đệm đầy đủ
Ở chế độ Truyền:
            1 = SSPBUF đã đầy.
            0 = SSPBUF trống.
Trong chế độ nhận:
            1 = SSPBUF đầy (không bao gồm ACK và dừng bit.)
            0 = SSPBUF trống.

Tần số đồng hồ I2C

  • Chỉ có đồng hồ khởi tạo chính trên dòng SCL.
  • SSPADD đăng ký trong tổng thể được sử dụng để tạo ra tần số đồng hồ I2C.
Cờ trạng thái và cờ ngắt
  • Sau khi truyền đầy đủ dữ liệu / địa chỉ, cờ đệm đầy đủ được đặt và cũng nhận tín hiệu được nhận. Sau khi nhận tín hiệu xác nhận, cờ ngắt SSPIF được thiết lập.
  • Trong khi tiếp nhận dữ liệu, cờ đệm đầy đủ được đặt khi nhận được byte hoàn chỉnh và thiết bị cần gửi tín hiệu Xác nhận để chỉ báo đọc tiếp tục. Và khi dữ liệu được chuyển từ đăng ký SSPSR sang SSPBUF, cờ SSPIF được thiết lập.  
  • Vì vậy, để kiểm tra xem việc truyền / nhận là hoàn thành hay không, chúng ta phải theo dõi hoặc cờ BF hoặc cờ ngắt SSPIF.

Lập trình PIC18F4550 I2C

Khởi tạo
  • Cấu hình PORTB.0 và PORTB.1 làm đầu vào pin.
  • Ngoài ra cấu hình SSPSTAT và SSPCON2 đăng ký.
  • Bật I2C bằng cách đặt bit SSPEN trong thanh ghi SSPCON1. Cũng chọn chế độ master / slave.
  • Đặt tần số truyền thông I2C bằng cách tải giá trị trong thanh ghi SSPADD ở chế độ chủ.
I2C_Master
void I2C_Init()
{
    TRISB0=1;  /* Set up I2C lines by setting as input */
    TRISB1=1;
    SSPSTAT=0x80;  /* Slew rate disabled, other bits are cleared */
    SSPCON1=0x28; /* Enable SSP port for I2C Master mode,
   clock = FOSC / (4 * (SSPADD+1))*/ 
    SSPCON2=0;
    SSPADD=Bit_rate; /* Clock 100 kHz */  
    SSPIE=1;  /* Enable SSPIF interrupt */
    SSPIF=0;
}


Bắt đầu giao tiếp I2C
  • Gửi xung bắt đầu tới thiết bị phụ bằng cách đặt bit trong SEN trong thanh ghi SSPCON2.
  • Đợi bit SEN để xóa.
  • Ngoài ra kiểm tra S bit trong SSPSTAT đăng ký mà chỉ ra bit bắt đầu được phát hiện hay không.
  • Và sau đó gửi địa chỉ slave của thiết bị cùng với thao tác ghi và kiểm tra tín hiệu báo nhận.
char I2C_Start(char slave_write_address)
{   
    SSPCON2bits.SEN=1;  /* Send start pulse */
    while(SSPCON2bits.SEN); /* Wait for completion of start pulse */
    SSPIF=0;
    if(!SSPSTATbits.S)  /* Check whether START detected last */
    return 0;   /* Return 0 to indicate start failed */   
    return (I2C_Write(slave_write_address)); /* Write slave device address
      with write to communicate */
}

Ghi / Truyền dữ liệu
Chúng ta phải theo dõi cờ BF hoặc SSPIF sẽ được thiết lập khi truyền / nhận một byte hoàn tất.
I2C Bus Ready
Kiểm tra cờ BF và bit R / W trong thanh ghi SSPSTAT để tìm bus I2C đã sẵn sàng hay chưa.
 void I2C_Ready()
{
    while(BCLIF); /* Wait if bit collision interrupt flag is set*/

    /* Wait for Buffer full and read write flag*/
    while(SSPSTATbits.BF || (SSPSTATbits.R_nW));
    SSPIF=0;    /* Clear SSPIF interrupt flag*/
}

Cũng có thể sử dụng cờ SSPIF để thăm dò trạng thái truyền / nhận byte hoàn chỉnh. Ngoài ra nó là cần thiết để xóa cờ ngắt SSPIF thông qua phần mềm.
void I2C_Ready()
{
    while(!SSPIF); /* Wait for operation complete */
    SSPIF=0;  /* Clear SSPIF interrupt flag*/
}

Sao chép / ghi dữ liệu vào thanh ghi SSPBUF để truyền và chờ hoàn thành quá trình truyền.
char I2C_Write(unsigned char data)
{
      SSPBUF=data; /* Write data to SSPBUF*/
      I2C_Ready();
      if (ACKSTAT) /* Check for acknowledge bit*/
        return 1;
      else
        return 2;
}

Sau khi viết nếu chúng tôi muốn dừng giao tiếp I2C,
Thiết lập bit PEN trong SSPCON2 đăng ký và chờ cho bit PEN để xóa.
Ngoài ra kiểm tra bit P trong thanh ghi SSPSTAT cho biết bit dừng được phát hiện.

char I2C_Stop()
{
    I2C_Ready();
    PEN=1;  /* Stop communication*/
    while(PEN);  /* Wait for end of stop pulse*/
    SSPIF = 0;
    if (!SSPSTATbits.P);/* Check whether STOP is detected last */
    return 0;  /* If not return 0 to indicate start failed*/
}

Đọc / nhận dữ liệu
  • Bật chế độ nhận bằng cách đặt bit RCEN trong SSPCON2.
  • Sau đó, chờ cờ đệm để thiết lập được đặt khi nhận được byte hoàn chỉnh.
  • Đọc bộ đệm ngay lập tức.
  • Sau khi đọc một byte, gửi tín hiệu xác nhận nếu chúng ta muốn đọc dữ liệu tiếp theo khác gửi xác nhận tiêu cực cho biết chúng tôi không muốn đọc dữ liệu tiếp theo.
  • Để thực hiện điều này, ACKDT = 1 hoặc 0 và ACKEN sẽ được bật.
/* Read data from location and send ack or nack depending upon parameter*/

char I2C_Read(char flag)
{
        int buffer=0;
        RCEN=1;   /* Enable receive */

 /* Wait for buffer full flag which when complete byte received */
        while(!SSPSTATbits.BF);
        buffer=SSPBUF;  /* Copy SSPBUF to buffer */

 /* Send acknowledgment or negative acknowledgment after read to 
 continue or stop reading */
        if(flag==0)
            I2C_Ack();
        else
            I2C_Nack();
        I2C_Ready();
        return(buffer);
}

Nhìn nhận
void I2C_Ack()
{
    ACKDT=0;  /* Acknowledge data 1:NACK,0:ACK */
    ACKEN=1;  /* Enable ACK to send */
    while(ACKEN);
 }

Xác nhận tiêu cực
void I2C_Nack()
{
    ACKDT=1;  /* Acknowledge data 1:NACK,0:ACK */
    ACKEN=1;  /* Enable ACK to send */
    while(ACKEN);
}




1 nhận xét: