nguyễn đình huân
Cố Vấn CLB
cho em hỏi về bài i2c. Trên lớp các anh có viết code đọc số giây từ ds1307 và sáng led nếu số giây là lẻ. Khi em cho chạy code thì nó bị dừng ở lệnh i2c_write, em debug thì thấy sau dòng
cờ ngắt UCNACKIFG được set lên 1, thậm chí em chưa chạy dòng đặt địa chỉ slave nữa. Em không hiểu tại sao.
thạch anh, nguồn cấp em đo bằng VOM thấy vẫn bình thường. 2 dây SCL, SDA dùng bus ngắn, em cũng xoắn lại luôn. Lúc chạy code có mấy lần em cấp ngược nguồn 5V nên con ds1307 bị nóng, không biết có ảnh hưởng gì không.
Đây là code đầy đủ hàm i2c_write trong file i2c.c
Còn đây là hàm main
Code:
while (UCB0CTL1 & UCTXSTP); // Loop until I2C STT is sent
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
while (!(IFG2&UCB0TXIFG));
thạch anh, nguồn cấp em đo bằng VOM thấy vẫn bình thường. 2 dây SCL, SDA dùng bus ngắn, em cũng xoắn lại luôn. Lúc chạy code có mấy lần em cấp ngược nguồn 5V nên con ds1307 bị nóng, không biết có ảnh hưởng gì không.
Đây là code đầy đủ hàm i2c_write trong file i2c.c
Code:
void i2c_write(unsigned char AddRes,unsigned char numbyte, unsigned char *poisend)
{
while (UCB0CTL1 & UCTXSTP); // Loop until I2C STT is sent
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
while (!(IFG2&UCB0TXIFG)); // sent word address
UCB0TXBUF = AddRes;
while (!(IFG2&UCB0TXIFG)); // check to see whether it is sent
unsigned char i;
for( i=0;i<numbyte;i++)
{
UCB0TXBUF= poisend[i] ;
while (!(IFG2&UCB0TXIFG));
}
UCB0CTL1 |= UCTXSTP; // I2C stop condition after 1st TX
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag
}
Code:
#include <msp430.h>
#include "I2C.h"
int main(void)
{ WDTCTL=WDTPW+WDTHOLD;
BCSCTL1=CALBC1_1MHZ;
DCOCTL=CALDCO_1MHZ;
P2DIR|=BIT0;
P2OUT|=BIT0;
unsigned char datawr[]={0x00,0x00,0x20,0x05,0x29,0x11,0x12};//20:00:00 t5 29/11/(20)12
unsigned char datarev[7];
i2c_init(0x68);
i2c_write(0x00,7,datawr);
while(1)
{
_delay_cycles(5000);
i2c_read(0x00,7,datarev);
if(datarev[0]%2)
P2OUT |=BIT0;
else
P2OUT &=~BIT0;
}
}