ATmega16利用TWI模塊讀寫24C02程序
工程名稱:AT_Mega16_master
創建日期:2007.10.21
程序編寫:朱海峰
聯系方式:543376422(QQ) 13405100406(手機)
AT24C02存儲一個字節,并讀回校驗,正確蜂鳴器響一聲,不正確響兩聲
AT24C02地址:0XA0
EEPROM地址:0X01
TWI工作方式:查詢方式
********************************************************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define SLA_W 0xa0 //從機地址,主機寫操作
#define SLA_R 0xa1 //從機地址,主機讀操作
#define EE_address 0x01 //EEPROM地址
#define Write_data 0x04 //寫入的數據
#define Baud_set 100 //TWI波特率設置
#define P_value 0x03 //預分頻值
#define beep_on() DDRD |= (1<<2);PORTD |= (1<<2);
#define beep_off() DDRD |= (1<<2);PORTD &= ~(1<<2);
//TWI讀寫操作公共步驟
#define ST_FAIL 0 //出錯狀態
#define ST_START 1 //START狀態檢查
#define ST_SLAW 2 //SLAW狀態檢查
#define ST_WADDR 3 //ADDR狀態檢查
//TWI讀操作步驟
#define ST_RESTART 4 //RESTART狀態檢查
#define ST_SLAR 5 //SLAR狀態檢查
#define ST_RDATA 6 //讀取數據狀態檢查,循環n字節
//TWI寫操作步驟
#define ST_WDATA 7 //寫數據狀態檢查,循環n字節
#define FAIL_MAX 20 //重試次數最大值
/**********************I2C狀態定義*************************/
/************************主機發送狀態碼********************/
#define TW_START 0x08 //START已發送
#define TW_REP_START 0x10 //重復START已發送
#define TW_MT_SLA_ACK 0x18 //SLA+W 已發送收到ACK
#define TW_MT_SLA_NACK 0x20 //SLA+W 已發送接收到NOT ACK
#define TW_MT_DATA_ACK 0x28 //數據已發送接收到ACK
#define TW_MT_DATA_NACK 0x30 //數據已發送接收到NOT ACK
#define TW_MT_ARB_LOST 0x38 //SLA+W 或數據的仲裁失敗
/*************************主機接收狀態碼*****************/
//#define TW_START 0x08 //START已發送
//#define TW_REP_START 0x10 //重復START已發送
#define TW_MR_ARB_LOST 0x38 //SLA+R 或NOT ACK 的仲裁失敗
#define TW_MR_SLA_ACK 0x40 //SLA+R 已發送接收到ACK
#define TW_MR_SLA_NACK 0x48 //SLA+R 已發送接收到NOT ACK
#define TW_MR_DATA_ACK 0x50 //接收到數據ACK 已返回
#define TW_MR_DATA_NACK 0x58 //接收到數據NOT ACK已返回
/************************從機接收狀態碼******************
#define TW_SR_SLA_ACK 0x60 //自己的SLA+W 已經被接收ACK已返回
#define TW_SR_ARB_LOST_SLA_ACK 0x68 //SLA+R/W 作為主機的仲裁失敗;自己的SLA+W 已經被接收ACK 已返回
#define TW_SR_GCALL_ACK 0x70 //接收到廣播地址ACK 已返回
#define TW_SR_ARB_LOST_GCALL_ACK 0x78 //SLA+R/W 作為主機的仲裁失敗;接收到廣播地址ACK已返回
#define TW_SR_DATA_ACK 0x80 //以前以自己的SLA+W被尋址;數據已經被接收ACK已返回
#define TW_SR_DATA_NACK 0x88 //以前以自己的SLA+W被尋址;數據已經被接收NOT ACK已返回
#define TW_SR_GCALL_DATA_ACK 0x90 //以前以廣播方式被尋址;數據已經被接收ACK已返回
#define TW_SR_GCALL_DATA_NACK 0x98 //以前以廣播方式被尋址;數據已經被接收NOT ACK已返回
#define TW_SR_STOP 0xA0 //在以從機工作時接收到STOP或重復START
/*************************從發送狀態碼*******************
#define TW_ST_SLA_ACK 0xA8 //自己的SLA+R 已經被接收ACK 已返回
#define TW_ST_ARB_LOST_SLA_ACK 0xB0 //SLA+R/W 作為主機的仲裁失敗;自己的SLA+R 已經被接收ACK 已返回
#define TW_ST_DATA_ACK 0xB8 //TWDR 里數據已經發送接收到ACK
#define TW_ST_DATA_NACK 0xC0 //TWDR 里數據已經發送接收到NOT ACK
#define TW_ST_LAST_DATA 0xC8 //TWDR 的一字節數據已經發送(TWAE = “0”);接收到ACK
/****************************其它狀態碼*****************
#define TW_NO_INFO 0xF8 //沒有相關的狀態信息;TWINT = “0”
#define TW_BUS_ERROR 0x00 //由于非法的START 或STOP 引起的總線錯誤
/******************************************************/
void Chip_init(void);
void TWI_init(void);
void Delay_ms(uint ms);
/*****************************************************/
void main (void)
{
uchar temp;
CLI();
Chip_init();
TWI_init();
Delay_ms(10);
while(1)
{
beep_on();
Delay_ms(1000);
beep_off();
Delay_ms(1000);
/************將0x04寫入AT24C02內部的以0X01為地址的存儲區****************/
TWCR = (1<
TWCR = (1<
TWCR = (1<
TWCR = (1<
/*********從AT24C02內部的以0X01為地址的存儲區讀出剛剛寫入的數據*************/
TWCR = (1<
TWCR = (1<
TWCR = (1<
TWCR = (1<
TWCR = (1<
{
beep_on();
Delay_ms(1000);
beep_off();
Delay_ms(1000);
}
else
{
beep_on();
Delay_ms(1000);
beep_off();
Delay_ms(1000);
beep_on();
Delay_ms(1000);
beep_off();
Delay_ms(1000);
}
for(;;)
NOP();
}
}
/*****************************************************
函數名:Chip_init
作 用:芯片的初始化
*****************************************************/
void Chip_init()
{
DDRD = 0X04; //00001000---PD2:蜂鳴器
PORTD = 0X00; //
}/****************************************************
函數名:TWI_init
作 用:TWI接口的初始化
*****************************************************/
void TWI_init(void)
{
TWAR = 0x00; //主機模式,該地址無效
TWCR = 0x00; //關閉TWI模塊
TWBR = Baud_set; //100
TWSR = P_value; //64分頻
}
/****************************************************/
void Delay_ms(uint ms)
{
uint i,j;
for(;ms>0;ms--)
for(i = 0;i<100;i++)
;
}
/*****************************
評論