[Help] Cấu Hình I2c bằng USCI

honghiep

Cố Vấn CLB
Staff member
trong diver LCD của clb có sẵn hàm lcd_put_num(); em mở ra đọc đi, có chú thích rất đầy đủ rồi đó
Em viết như thế này:
PHP:
#include "msp430g2553.h"
#include "lcd.c"
#include "i2c.c"
unsigned char *datarev;
long int i;
void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
//P1REN = BIT6 + BIT7;
P1DIR = 0xFC;
P2DIR |= 0xff;
lcd_init();
i2c_init(0x68); //Them cai ham nay thi khong hien gi len LCD dc nua???
unsigned char datawr[]={0x00,0x08,0x03,0x05,0x15,0x11,0x12};
i2c_write(0x00,7, datawr);
 
 
 
 
while(1)
  {
 
  lcd_puts ("Hello Word !!");
 
  i2c_read(0x00,8,datarev);
  __delay_cycles(1000000);
  lcd_clear();
 
  i=datarev[0];
 
  lcd_put_num (i, 0, 0);
  __delay_cycles(1000000);
  lcd_clear();
  }
}

Không hiểu sao khi em không viết các lênh giao tiếp với DS1307, chỉ cho hiển thị một dngf "Hello word" thì nó chạy (Em test trực tiếp trên mạch thật)
nhưng khi em viết code giao tiếp với DS1307 vào thì màn hình nó trống rỗng???? các anh xem code giúp em có lỗi chỗ nào không ạ???:((
Cái dòng #include, bạn phải include header file (*.h) chứ không phải source file (*.c)
 

lee_trieu

Gà con
Cái dòng #include, bạn phải include header file (*.h) chứ không phải source file (*.c)[/quote]
tại em xem trong file I2c.h không có dòng nào include I2c.c, còn trong I2c.c lại có include I2c.h nên em mới include i2c.c.
em debug thì thấy nó bị treo ở chỗ i2c_write(0x00,7, datawr); Vậy là lỗi do đâu vậy anh ??? em ráp mạch thực tế theo hinh sơ đồ này: điện trở kéo lên em gắn 4.7k và kéo lên nguồn Vcc của KIT launchpad.
C
 

honghiep

Cố Vấn CLB
Staff member
Header file (*.h) là file define các API được sử dụng, còn việc tìm kiếm suorce của các API này do các phần khác làm, bạn chỉ cần add source file (*.c) vào chương trình sẽ tự kiếm cho bạn
Còn i2c_write(....) là 1 chương trình con, bên trong có các lệnh nhỏ hơn. Bạn cần debug Step into để biết chính xác là chương trình treo ở đâu
 

lee_trieu

Gà con
Header file (*.h) là file define các API được sử dụng, còn việc tìm kiếm suorce của các API này do các phần khác làm, bạn chỉ cần add source file (*.c) vào chương trình sẽ tự kiếm cho bạn
Còn i2c_write(....) là 1 chương trình con, bên trong có các lệnh nhỏ hơn. Bạn cần debug Step into để biết chính xác là chương trình treo ở đâu
Nếu em thay I2C.c bằng I2c.h thì nó lại báo lỗi như thế này nè anh:
 

lee_trieu

Gà con
Bạn cần add các source file (*.c) tương ứng vào project nữa nhé :5cool_sweat:
vâng em đã add tất cả vào hết rồi đó anh, từ LCD, UART, I2c,...tất cả Driver luôn rồi mà sao khi debug nó lại báo lỗi vậy anh???
Em đổi thành LCD.c và I2c.c thì nó không còn lỗi nữa ???chẳng hiểu sai chỗ nào nưã??:-s
 

lee_trieu

Gà con
Header file (*.h) là file define các API được sử dụng, còn việc tìm kiếm suorce của các API này do các phần khác làm, bạn chỉ cần add source file (*.c) vào chương trình sẽ tự kiếm cho bạn
Còn i2c_write(....) là 1 chương trình con, bên trong có các lệnh nhỏ hơn. Bạn cần debug Step into để biết chính xác là chương trình treo ở đâu
Anh ơi em test từng bước một thì nó bị treo ở vòng lặp này hoài là bị gì vậy anh//????
while (!(IFG2&UCB0TXIFG));
 

nhokviet

Trứng gà
Header file (*.h) là file define các API được sử dụng, còn việc tìm kiếm suorce của các API này do các phần khác làm, bạn chỉ cần add source file (*.c) vào chương trình sẽ tự kiếm cho bạn
Còn i2c_write(....) là 1 chương trình con, bên trong có các lệnh nhỏ hơn. Bạn cần debug Step into để biết chính xác là chương trình treo ở đâu
Anh ơi em test từng bước một thì nó bị treo ở vòng lặp này hoài là bị gì vậy anh//????
while (!(IFG2&UCB0TXIFG));
Mình cũng bị như thế này, mình dùng chip MSP430G2553 thư viện ở https://docs.google.com/folder/d/0B_h_-MVRltJ3cVF5QllUSW9td00/edit?pli=1&docId=0B_h_-MVRltJ3XzhJdWFidkVtXzg
Code mình như sau:
Code:
#include <msp430.h>
#include "I2C.h"
/*
* main.c
*/
#define SEC        0x00
#define MIN        0x01
#define HOUR      0x02
#define DAY        0x03
#define DATE      0x04
#define MONTH      0x05
#define YEAR      0x06
 
//unsigned char myTime[8];
unsigned char *clock_data[7];
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
 
    BCSCTL1 = CALBC1_1MHZ;    // Set range to 1mhz Calibrated Range
    DCOCTL = CALDCO_1MHZ;    // Set DCO to 1mhz Calibrated DCO
    i2c_init(0x68);
    while (1){
        i2c_read(SEC,1,clock_data[0]);
        i2c_read(MIN,1,clock_data[1]);
        i2c_read(HOUR,1,clock_data[2]);
    }
    return 0;
}
Mình không phải là dân điện tử nên ko bik fix như thế nào, nếu là do phần cứng thì các bạn chỉ rõ giúp mình cách fix với :(
 

honghiep

Cố Vấn CLB
Staff member
Bạn kiểm tra trở kéo. Dây tín hiệu xoắn vào nhau để giảm nhiễu
 

nhokviet

Trứng gà
Bạn kiểm tra trở kéo. Dây tín hiệu xoắn vào nhau để giảm nhiễu


Mình dùng đồng hồ đo 2 trở R3, và R4 thì vẫn ok. Dây SCL và SDA đã xoắn nhưng vẫn treo.
Mình ráp mạch như sau:
Kit launchPad P1.6 => SCL, P1.7 => SDA. Nguồn từ USB. Nối đất chung DS1307.
Module DS1307 nối nguồn 5V.
 

honghiep

Cố Vấn CLB
Staff member
Vài ngày trôi qua rồi, ko ai để í luồng này hết.
Thế có lẽ ca này khó :gach
Thế này nhé, nếu phần cứng chuẩn, chống nhiễu tốt thì có một lưu ý nhỏ với code của bạn. Mình nghĩ là I2C đọc được ít nhất là 1 lần
Trường hợp code như của bạn có vẻ DS1307 đáp ứng không kịp bởi sau khi thực hiện xong i2c_read() lần đầu, tín hiệu STOP được tạo ra. Sau đó bạn tiếp tục thực hiện một lệnh i2c_read() nữa, lúc này tín hiệu START được tạo. 2 tín hiệu này gần như liên tục nên DS1307 không kịp nhận biết nên các byte sau đó sẽ sai, dẫn đến hiện tượng treo.
Vì thế bạn cần thêm 1 khoảng delay giữa các lệnh.
Chúc bạn may mắn!:doc
 

nhokviet

Trứng gà
May quá có ng reply rồi!! :D
Cho mình hỏi bằng cách nào để kiểm tra phần cứng chuẩn và chống nhiễu tốt :).
Hàm i2c_read không thực hiện thành công 1 lần nào. nên ko phải do xử lý quá nhanh như bạn nói rồi.

Ngoài luồng tí: Cho mình hỏi dân ngoại đạo bước đầu vào điện tử nên tìm hiểu những gì?
 

honghiep

Cố Vấn CLB
Staff member
Theo mình thấy thì phần cứng như bạn nói là ổn rồi, bạn thử thêm delay vào xem vấn đề có được cải thiện không
Còn vấn đề ngoài luồng thì mình không có kinh nghiệm cho lắm. Nói chung là dân điện tử khi mới vô đạo thì cũng được xem là dân ngoại đạo thôi
 

nhokviet

Trứng gà
Hic dân điện tử mới vô đạo tuy là mới nhưng đc training bài bản. còn dân ngoại đạo ko đc training nữa lấy gì mà bài bản :D. Mình thank trước mai mình test lại do mình ko để board test ở nhà.
 

lee_trieu

Gà con
Bạn kiểm tra trở kéo. Dây tín hiệu xoắn vào nhau để giảm nhiễu
Chào anh ! cho em hỏi tí, em đang gặp khó khăn với việc giao tiếp G2553 với DS1307
em đã test với mạch thực tế là chỗ Vcc bên hình dưới em gắn vào nguồn 3.3v trên KIT Launchpad, cấp nguồn 5v riêng cho chân số 8 của DS1307(nối mass chung). nhưng không biết sao nó vẫn không hoạt động được nữa>>> anh giúp em phàn này với không biết nó bị lỗi ở đâu nữa ???
 
Top