[C7] Tổng kết bài I2C

Manhdd

Cố Vấn CLB
Staff member
<<Tổng hợp Bài giảng và Drivers C7 >>

Bài tập tự luyện:
1. Đọc thời gian thực từ chip DS1307 hiển thị lên LCD.
Định dạng ví dụ:
Hàng1: DD-MM-YYYY
Hàng2: HH-MM-SS

2. Nên tìm hiểu thêm ví dụ về giao tiếp I2C với chip khác như cảm biến nhiệt TMP100, TMP101, hoặc là chip thời gian thực (RTC) từ TI BQ32000 (chip này khá giống với DS1307 )… những chip này có thể xin samples trên TI.com (xin vừa đủ cho nhu cầu thôi nhé).
Ngoài ra, cần lên tme.vn để xem qua một vài cảm biến có giao tiếp I2C được bán. Tiêu điểm là các cảm biến gia tốc (giao tiếp I2C, SPI), các bạn có thể ứng dụng nó cho bài tập cuối khoá (dự kiến báo cáo sau thi cuối kì).

3. Sử dụng module TRIAC để đóng cắt tải AC dân dụng (đèn, quạt, ...) theo giờ đã định, đọc từ DS1307. Module TRIAC trên mạch chưa được nói kĩ trên lớp, các bạn có thể hỏi các adviser. Chú ý an toàn về điện khi làm việc với module này (cần chú ý cách điện và giữ khoảng cách an toàn khi mạch chạy, nó đóng 220VAC vào đấy nhé).
 

tranhieu_hcmut

Cố Vấn CLB
Staff member
Mấy câu tương tự như vậy e phải tự trả lời đi chứ :botay:. E tự tra datasheet đi cho quen nhé
 

omega5161

Thành Viên PIF
em có tra rồi, e thử cấp nguồn 3.3v nhưng nó ko chạy, định cấp nguồn 5v như con DS1307 nhưng ko giám nên mới hỏi mấy anh chị mà
 

Manhdd

Cố Vấn CLB
Staff member
em có tra rồi, e thử cấp nguồn 3.3v nhưng nó ko chạy, định cấp nguồn 5v như con DS1307 nhưng ko giám nên mới hỏi mấy anh chị mà
Bó tay thẳng nhỏ này luôn. Chắc em nghĩ nguồn lớn hơn sẽ dễ chạy hơn hả =))
Nhớ xem kĩ datasheet, coi lại code tí nhé, theo anh nhớ thì chả khác gì DS1307 cả, lại còn có thêm mấy thanh ghi để calib nữa.
 

Manhdd

Cố Vấn CLB
Staff member
Uhm. Cũng quên nhắc mấy em là chú ý I2C Address nữa.
Thôi thì giúp cho trót. Đây là code I2C giao tiếp BQ32000 anh viết cho cái Smart Clock với MSP430G2452, module USI. Em tự coi để thấy điểm khác biệt nhé, không nhiều đâu.
Code:
/*
* BQ32000.c
*
*  Created on: Apr 30, 2012
*      Author: Nguyen Tien Manh
*/
 
/****************************************************************
* IMPORT
****************************************************************/
 
#include  "msp430g2452.h"
 
#include "i2c.h"
 
// DS1307 7-bit address =  0b 110 1000 = 0x68
#define    BQ32000_ADD    0x68
#define        READ        1
#define    WRITE        0
 
/*****************************************************************
GLOBAL VARIABLE
******************************************************************/
 
volatile unsigned char sec, min, hour, day, date, month, year;
/*****************************************************************
* ROUTINES
******************************************************************/
void clock_write(char fixed_time)
{
    if (fixed_time)
    {
    //////////////////////// Input data for write time
    sec =  0x00    ; // CH=0 (bit7, clock-counting)
    min =  0x03    ; // minutes
    hour =  0x10    ; // hour-mode (bit 6) = 0 -> 24-hour
    day =  0x04    ; // define sunday = 0x00 or 0x01
    date =  0x02    ; // date
    month = 0x05    ; // month
    year =  0x12    ; // year
    }
    /// Writing..
    //Send Start condition
    i2c_start();
    //Send Slave address + WRITE command
    i2c_write8((BQ32000_ADD<<1)|WRITE);
    //  ((BQ32000_ADD<<1)| WRITE) = ((0x68<<1)|0) = 0xD0
    //Send register address (register of Slave – the first register need to read data)
    i2c_write8(0x00);
 
    //write data
    i2c_write8(sec); // write to 0x00
    i2c_write8(min); // write to 0x01
    i2c_write8(hour); // write to 0x02
    i2c_write8(day); // write to 0x03
    i2c_write8(date); // write to 0x04
    i2c_write8(month); // write to 0x05
    i2c_write8(year); // write to 0x06
 
    //Send Stop condition
    i2c_stop();
    ///..
}
void read_data (unsigned char reg)
{
    i2c_start(); //Send Start condition
    i2c_write8((BQ32000_ADD<<1)|WRITE);//Send Slave address + WRITE command
    i2c_write8(reg); //Send register address (register of Slave – the first register need to read data)
    i2c_stop(); //ReStart condition
    i2c_start();
    i2c_write8((BQ32000_ADD<<1)|READ); //Send Slave address + READ command
}
 
void clock_read (void)
{
    //unsigned char old;
    //Send Start condition
    i2c_start();
    //Send Slave address + WRITE command
    i2c_write8((BQ32000_ADD<<1)|WRITE);
    //  ((SLAVE_ADD<<1)| WRITE) = ((0x68<<1)|0) = 0xD0
    //Send register address (register of Slave – the first register need to read data)
    i2c_write8(0x00);
 
    //ReStart condition
    i2c_stop();
    i2c_start();
 
    //Send Slave address + READ command
    i2c_write8((BQ32000_ADD<<1)|READ);
    // ((SLAVE_ADD<<1)| READ) = ((0x68<<1)|1) = 0xD1
 
    //read data
    //old = sec;
    sec = i2c_read8(0); //read from 0x00 & ACK
 
    //old = min;
    min = i2c_read8(0); //read from 0x01 & ACK
 
    //old = hour;
    hour = i2c_read8(0); //read from 0x02 & ACK
 
 
    day = i2c_read8(0); //read from 0x03 & ACK
    date = i2c_read8(0); //read from 0x04 & ACK
    month = i2c_read8(0); //read from 0x05 & ACK
    year = i2c_read8(0XFF); //read from 0x06 & NACK
    //Send Stop condition
    i2c_stop();
 
}
 

pc_is_me

Thành Viên PIF
chỉ là thay đổi lại thứ tự của chuổi. vì chuổi bắt đầu từ 0 chứ không phải là 1. sửa lại để khi dùng dễ dàng và dễ hiểu hơn :D
 

Kisses Hacker

Art Supporter
Staff member
chỉ là thay đổi lại thứ tự của chuổi. vì chuổi bắt đầu từ 0 chứ không phải là 1. sửa lại để khi dùng dễ dàng và dễ hiểu hơn :D
Hèn gì đọc từ con DS1307 phải lấy thời gian giây (second) ở phần tử 1 của mảng. Giờ thì đã thông :D
 
Top