|
atmega128 TWI 读写AT24C16 出错,读24C02没问题,第一次写的时候没问题,读出错,然后写也出错了。连续写没问题,一读就出问题/*
* _24C16_IIC.c
*
* Created: 2014/6/27 10:33:44
* Author: HP
*/
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include "twi.h"
#include "uart.h"
int main(void)
{
unsigned char value;
twi_init();
usartinit();
_delay_ms(1000);
while(1)
{
putchar0(0xaa);
//putchar0(0x55);
value=IIC_Write_24C16(0x06,0x43);
putchar0(value);
value=IIC_Read_24C16(0x43);
putchar0(value);
_delay_ms(200);//TODO:: Please write your application code
}
}
////////////////TWI.C文件////////////////////////////////////////////
#include "twi.h"
void twi_init() //初始化IIC
{
TWBR=0x20;
TWCR=0x04;
TWSR=0x00;
}
////////////////////////////////////////////////////////////////////////////
unsigned char IIC_Write_24C16(unsigned char wdata , unsigned char addr)
{
Start();
Wait();
if(TestAck()!=START)
return 5;
Write8bit(WD_24C16_ADDR);
Wait();
if(TestAck()!=MT_SLA_ACK)
return 2;
Write8bit(addr);
Wait();
if(TestAck()!=MT_DATA_ACK)
return 3;
Write8bit(wdata);
Wait();
if(TestAck()!=MT_DATA_ACK)
return 4;
Stop();
return 0;
}
/////////////////////////////////////////////////////////////
unsigned char IIC_Read_24C16(unsigned char addr)
{
unsigned char value;
Start();
Wait();
if(TestAck()!=START)
return 4;
Write8bit(WD_24C16_ADDR);
Wait();
if(TestAck()!=MT_SLA_ACK)
return 3;
Write8bit(addr);
Wait();
if(TestAck()!=MT_DATA_ACK)
return 2;
Start();
Wait();
if(TestAck()!=RE_START)
return 5;
Write8bit(RD_24C16_ADDR);
Wait();
if(TestAck()!=MR_SLA_ACK)
return 6;
Twi();
Wait();
if(TestAck()!=MR_DATA_NOACK)
return 7;
value=TWDR;
Stop();
return (value);
}
//////////////TWI.H文件//////////////////////////////
#ifndef __TWI_H__
#define __TWI_H__
#include <avr/io.h>
#include <util/delay.h>
//MT 主方式传输 MR主方式接收
#define START 0X08
#define RE_START 0X10
#define MT_SLA_ACK 0X18
#define MT_SLA_NOACK 0X20
#define MT_DATA_ACK 0X28
#define MT_DATA_NOACK 0X30
#define MR_SLA_ACK 0X40
#define MR_SLA_NOACK 0X48
#define MR_DATA_ACK 0X50
#define MR_DATA_NOACK 0X58
#define RD_24C16_ADDR 0XA1 //读器件地址
#define WD_24C16_ADDR 0XA0 //写器件地址
#define Start() (TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动IIC
#define Stop() (TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)) //停止IIC
#define Wait() {while (!(TWCR & (1<<TWINT)));} //等待中断发生
#define TestAck() (TWSR&0Xf8) //观察返回状态
#define SetAck() (TWCR|=(1<<TEEA)) //ack应答
#define SetNoAck() (TWCR&=~(1<<TEEA)) //noack应答
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动IIC
#define Write8bit(x) {TWDR = x;TWCR = (1<<TWINT)|(1<<TWEN);} //写数据
void twi_init();
unsigned char IIC_Write_24C16(unsigned char wdata , unsigned char addr);
unsigned char IIC_Read_24C16(unsigned char addr);
#endif
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|