您的位置 首页 被动

ATmega16使用TWI模块读写24C02程序

********************************************************工程名称:AT_Mega16_master创建日期:20071021程序编写:朱海峰联系

/********************************************************

工程称号: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< while (!(TWCR & (1< TWDR = SLA_W;
TWCR = (1< while (!(TWCR & (1< TWDR = EE_address;
TWCR = (1< while (!(TWCR & (1< TWDR = Write_data;
TWCR = (1< while (!(TWCR & (1< TWCR = (1< Delay_ms(50);
/*********从AT24C02内部的以0X01为地址的存储区读出刚刚写入的数据*************/
TWCR = (1< while (!(TWCR & (1< TWDR = SLA_W;
TWCR = (1< while (!(TWCR & (1< TWDR = EE_address;
TWCR = (1< while (!(TWCR & (1< TWCR = (1< while (!(TWCR & (1< TWDR = SLA_R;
TWCR = (1< while (!(TWCR & (1< TWCR = (1< while (!(TWCR & (1< temp = TWDR;
TWCR = (1< if (temp == Write_data)
{
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++)
;
}
/*****************************

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/254122.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部