Chào các bạn!
Mình đang test AVR Mega16 dùng Codevision. Mình đang thử chức năng I2C của nó. Trong CodeVision có hỗ trợ hàm I2C sẵn rồi. Mình viết chương trình (dựa vào Code mẫu của CodeVision) ghi một byte vào EEPROM 24C02, sau đó đọc lại và xuất ra PortD. Nhưng không hiểu sao, giá trị xuất ra PORTD chỉ là 0xff. Bạn nào làm qua rồi giúp mình với, chương trình của mình như sau:
(Phần cứng con 24C02 mình nối A2,A1,A0 xuống GND, WP lên Vcc, 2 chân SDA và SCL kéo lên dùng R = 10K)
//Example how to access an Atmel 24C02 256 byte I2C EEPROM:
/* the I2C bus is connected to PORTB */
/* the SDA signal is bit 3*/
/* the SCL signal is bit 4 */
#asm
.equ __i2c_port=0x18
.equ __sda_bit=3
.equ __scl_bit=4
#endasm
/* now you can include the I2C Functions */
#include <mega16.h>
#include <i2c.h>
/* function declaration for delay_ms */
#include <delay.h>
#define EEPROM_BUS_ADDRESS 0xa0
/* read a byte from the EEPROM */
unsigned char eeprom_read(unsigned char address) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}
/* write a byte to the EEPROM */
void eeprom_write(unsigned char address, unsigned char data) {
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_write(data);
i2c_stop();
/* 10ms delay to complete the write operation */
delay_ms(10);
}
void main(void) {
unsigned char i;
DDRD = 0xff;
PORTD = 0x00;
delay_ms(1000);
/* initialize the I2C bus */
i2c_init();
/* write the byte 55h at address AAh */
eeprom_write(0xaa,0x55);
/* read the byte from address AAh */
i=eeprom_read(0xaa);
PORTD = i;
while (1); /* loop forever */
}
Mình đang test AVR Mega16 dùng Codevision. Mình đang thử chức năng I2C của nó. Trong CodeVision có hỗ trợ hàm I2C sẵn rồi. Mình viết chương trình (dựa vào Code mẫu của CodeVision) ghi một byte vào EEPROM 24C02, sau đó đọc lại và xuất ra PortD. Nhưng không hiểu sao, giá trị xuất ra PORTD chỉ là 0xff. Bạn nào làm qua rồi giúp mình với, chương trình của mình như sau:
(Phần cứng con 24C02 mình nối A2,A1,A0 xuống GND, WP lên Vcc, 2 chân SDA và SCL kéo lên dùng R = 10K)
//Example how to access an Atmel 24C02 256 byte I2C EEPROM:
/* the I2C bus is connected to PORTB */
/* the SDA signal is bit 3*/
/* the SCL signal is bit 4 */
#asm
.equ __i2c_port=0x18
.equ __sda_bit=3
.equ __scl_bit=4
#endasm
/* now you can include the I2C Functions */
#include <mega16.h>
#include <i2c.h>
/* function declaration for delay_ms */
#include <delay.h>
#define EEPROM_BUS_ADDRESS 0xa0
/* read a byte from the EEPROM */
unsigned char eeprom_read(unsigned char address) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}
/* write a byte to the EEPROM */
void eeprom_write(unsigned char address, unsigned char data) {
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_write(data);
i2c_stop();
/* 10ms delay to complete the write operation */
delay_ms(10);
}
void main(void) {
unsigned char i;
DDRD = 0xff;
PORTD = 0x00;
delay_ms(1000);
/* initialize the I2C bus */
i2c_init();
/* write the byte 55h at address AAh */
eeprom_write(0xaa,0x55);
/* read the byte from address AAh */
i=eeprom_read(0xaa);
PORTD = i;
while (1); /* loop forever */
}
Comment