[C9] I2C bị rơi vào vòng lặp vô tận "while(!(IFG2&UCB0TXIFG))"

Phạm Thành Danh

Thành Viên PIF

Tình hình là em không hiểu sao phần code i2c của em nó cứ rơi vào cái vòng lặp này rồi không thoát ra được, em dùng code mẫu của clb nhưng vẫn lỗi .
Code:
#include <msp430.h>
#include "basic_config.h"
#include "LCD.h"
#include "I2C.h"
int sec, min, hour, day , date , month, year;
char  dayc,Sun,Mon,Tues,Wed,Thurs,Fri,Sat;
unsigned char datawr[]={0x00,0x20,0x10,0x01,0x15,0x07,0x13};
  // khai báo data write
  unsigned char datarev[8];
void main()
{
 
  Config_stop_WDT(); // stop WDT, see description in Basic_config.c
  Config_Clocks();
  P2SEL &=  ~BIT6 + ~BIT7; // 2.6,2.7 are GPIO
  P2SEL2 &=  ~BIT6 + ~BIT7;
 
  lcd_init(1);
  lcd_backlight(1); // turn on LCD backlight
  i2c_init(0x68);
  i2c_write(0x00,7, datawr); //write multi – byte
 
  while(1)
  {
  i2c_read(0x00,7,datarev);
  sec  =((datarev[0]&0xf0)>>4)*10 + (datarev[0]&0x0f);
  min  =((datarev[1]&0xf0)>>4)*10 + (datarev[1]&0x0f);
  hour =((datarev[2]&0xf0)>>4)*10 + (datarev[2]&0x0f);
  day  =((datarev[3]&0xf0)>>4)*10 + (datarev[3]&0x0f);
  date =((datarev[4]&0xf0)>>4)*10 + (datarev[4]&0x0f);
  month=((datarev[5]&0xf0)>>4)*10 + (datarev[5]&0x0f);
  year =((datarev[6]&0xf0)>>4)*10 + (datarev[6]&0x0f);
}
Hixxx :-s:((

nó bị lỗi ngày dòng i2c_write của file i2c.c:gach
 

Phạm Thành Danh

Thành Viên PIF
mạch cũ mà vẫn bị ah, thế hôm học có bị k, mạch mới của mình bị, còn mạch cũ thì tháo ra để lấy linh kiện hết rồi :5cool_beat_plaster::-s
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Hồi đó hình như mình cũng dính cái giống thế này :1cool_byebye: Chả biết sao sửa
 

pas_mgcaru

Thành Viên PIF
timer timer timer chắc chữa cháy dk....phải có cái board riêng b gắn vô chắc cũng dk mà chơi theo kiểu module
 

Kisses Hacker

Art Supporter
Staff member
Mình làm việc với DS1307 cũng thường bị dính chỗ đó :gach Và theo kinh nghiệm thì mình chắc chắn là do phần cứng, vả lại code mẫu cũng không chạy thì vấn đề không phải nằm ở phần mềm rồi. Các bạn kiểm tra lại dây nhợ, nguồn cấp cho DS1307 xem sao.
 

chung

Trứng gà
thỉnh thoảng mình cũng bị vụ này, cách giải quyết của mình là cho watchdog chạy rồi chờ cờ, nếu WD tràn mà cờ ko tắt thì reset chạy lại :D
 

Phạm Thành Danh

Thành Viên PIF
em thấy nguồn cấp cho DS1307 là 5v, còn cho msp là 3.3v, như zị nó có ảnh hưởng gì trong lúc truyền nhận dữ liệu không anh. Với lại lúc làm mạch có gì cần phải lưu ý nữa không, tại em dùng lại nguyên cái schemtic của clb mà :5cool_beat_plaster:
 

cowboyhere

Cố Vấn CLB
Staff member
bạn kéo trở 4.7 lên 3.3V ở 2 chân SDA SCL, xoắn 2 dây SDA SCL lại, 2 dây này càng ngắn càng tốt, ko kéo trở nội, chương trình dừng ở đó là do chưa nhận trả lời từ slave, chắc chắn do phần cứng
nếu là BQ32000 thì ko cần trở kéo, cấp 3.3V
 
Top