⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 IIC通信
💻 C
字号:
#include	<avr/interrupt.h>
#include	<avr/signal.h>
#include	<avr/wdt.h>
#include	<avr/iom48.h>

#include	"IIC.h"
#include	"Uart.h"


/***********************************/
#define u8 		uint8_t
#define u16 	uint16_t
#define u32 	uint32_t
#define byte    unsigned char
#define word 	uint16_t

#define rd_device_add 0xa1
#define wr_device_add 0xa0
#define wr_8574_add   0x41

#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char

#define i2c_data  (1<<4)
#define i2c_clk   (1<<5)
#define ack 0x01


byte rx_buf[256];
byte Flagrx;

void SCIDeal(void);
void TxStr(char *buf,int len);
byte i2c_Write(byte Wdata,byte RomAddress);
byte P8574_Read(void);
void P8574_write(byte data);
void E2PROM_write(byte page,byte addr,byte value);
void delay_us(int time);
byte E2prom_Read(byte page,byte addr);
void TxBuf(byte ch);
byte E2prom_8574_Read(void);
byte E2PROM_Page_write(byte page,byte addr,byte *value,byte len);
void E2prom_Page_Read(byte Page,byte addr,byte *value);

byte flag2data=0;

int main(void)
{
	byte temp;
	//OSCCAL = 0x80;
	DDRC=0xFF;
	DDRD=0xFF;
	PORTD=0x64;
	SCIInit();
	//IICInit();
	sei();
	PORTC=0xF8;
	
	//temp=E2prom_8574_Read();
	//TxBuf(temp);
	for(;;)
	{
		if(Flagrx==2)
		{
			//TxBuf(0xbb);
			SCIDeal();
			Flagrx=0;
		}
		//TxBuf(0xbb);
	/*	temp=E2prom_8574_Read();
		
		if((temp&3)!=3) PORTC|=1;else PORTC&=~1;
		if((temp&12)!=12) PORTC|=2;else PORTC&=~2;
		if((temp&48)!=48) PORTC|=4;else PORTC&=~4;
		*/
	}
}

void SCIInit(void)
{
	/****************** UART接口初始化 ********************************/
	UCSR0A=1<<U2X0;
	//RXCIEn TXCIEn UDRIEn RXENn TXENn UCSZn2 RXB8n TXB8n
	UCSR0B=(1<<RXCIE0)|(1<< RXEN0)|(1<< TXEN0);
	//UMSELn1 UMSELn0 UPMn1 UPMn0 USBSn UCSZn1 UCSZn0 UCPOLn UCSRnC
	//UCSR0C=1<< UCSZ01 |1<<UCSZ00;
	UBRR0=(u32)8000000/9600/8-1; //系统时钟选择8MHZ

}

void TxBuf(byte ch)
{
	
	while ( !( UCSR0A & (1<<UDRE0)) );/* 将数据放入缓冲器,发送数据*/
	UDR0 = ch;
	UCSR0A |= (1<<TXC0);
}


void TxStr(char *buf,int len)
{
	byte i;
	for(i=0;i<len;i++)
		TxBuf(*(buf+i));
}


//串口中断
SIGNAL(SIG_USART_RECV)
{	
	static byte lenth;
	byte temp1;	
	
	
	temp1=UDR0;
	
	if (Flagrx==1)
	{
		rx_buf[lenth+1]=temp1;
		lenth++;
		if((temp1==0xBB)&&(lenth==rx_buf[1]+1))
		{
			//TxBuf(lenth);
			lenth=0;
			Flagrx=2;
			
		}
	}else
	{
		if(temp1==0xAA)
		{
			Flagrx=1;
			lenth=0;
			rx_buf[0]=temp1;
			
		}
	}
}


void delay_us(int time)
{     
  	do
	{
		 time--;
	}	
  	while (time>1);
}	  


void delay_ms(word time)
{
	while(time!=0)
	{		
	   delay_us(1000);
	   time--;
	}
}

 
void SCIDeal(void)
{
	byte reLen=0;
	byte i;
	word addr0;
	byte page,addr;
	UCSR0B&=~(0<<RXCIE0);
	switch(rx_buf[2])
	{
		case 1:
			for(i=0;i<rx_buf[3];i++)
			{
				addr0=rx_buf[4]*256+rx_buf[5]+i;
				page=(byte)(addr0>>8);
				addr=(byte)(addr0&0xFF);
				delay_us(3000);
				E2PROM_write(page,addr,rx_buf[i+6]);
			}
			rx_buf[3]=0xFE;
			reLen=1;
		break;
		case 2://读E2prom
			for(i=7;i<rx_buf[4]+7;i++)	
			{
				*(rx_buf+i)=E2prom_Read(rx_buf[5],rx_buf[6]+i-7);
			}
			reLen=rx_buf[4]+4;
		break;
		case 3://读8574
			rx_buf[3]=E2prom_8574_Read();
			rx_buf[4]=0xFE;
			reLen=2;
			if((rx_buf[3]&3)!=3) PORTC|=1;else PORTC&=~1;
			if((rx_buf[3]&12)!=12) PORTC|=2;else PORTC&=~2;
			if((rx_buf[3]&48)!=48) PORTC|=4;else PORTC&=~4;	
	
		break;
		case 4://写数据
			E2PROM_Page_write(rx_buf[4],rx_buf[5],rx_buf+6,rx_buf[3]);
			rx_buf[3]=0xFE;
			reLen=2;
		break;
		default:;
	}
	
	rx_buf[1]=reLen+2;
	rx_buf[reLen+3]=0xBB;
	TxStr(rx_buf,reLen+4);
	UCSR0B!=1<<RXCIE0;
}


void i2cwait(void){
     delay_us(30);
}

void i2cstart(void){ 
	PORTD=0x20;
	i2cwait();
    PORTC|=i2c_data; //1
    PORTC|=i2c_clk;  //1
    i2cwait();
    PORTC&=~i2c_data;//0
    i2cwait();
    PORTC&=~i2c_clk; //0
}

void i2cstop(void){
     PORTC&=~i2c_data; //0
     i2cwait(); 
     PORTC|=i2c_clk;   //1
     i2cwait(); 
     PORTC|=i2c_data;  //1
}

void i2csentbyte(byte temp12){
    unsigned char i=8;
    while (i--){
        if (temp12&0x80){PORTC|=i2c_data;}else{PORTC&=~i2c_data;}
        temp12<<=1; 
        i2cwait();
        PORTC|=i2c_clk; //1
        i2cwait();
        PORTC&=~i2c_clk;//0 
    }	
	//PORTC|=i2c_data;  //1
    DDRC&=~i2c_data;  //设置data为输入
    PORTD=0x40;
	i2cwait();
    PORTC|=i2c_clk;   //1   
	i2cwait();
	//PORTD=0x44;
    if (PINC&i2c_data){flag2data|=ack;}else{flag2data&=~ack;}
    PORTC&=~i2c_clk;  //0
	PORTD=0x20;
	DDRC|=i2c_data;  //设置data为输出   
	PORTC&=~i2c_data;
}

uchar i2creceivebyte(void){
    unsigned char i,temp12=0;
    DDRC&=~i2c_data; //设置data为输入
     //TxBuf(DDRC);
	PORTD=0x44;
	i2cwait();
	PORTC|=i2c_data;  //1
    for(i=0;i<8;i++){
        PORTC|=i2c_clk;  //1
		PORTC|=i2c_data;  //1
        i2cwait();
		temp12<<=1;
        if (PINC&i2c_data){temp12++;} 
		PORTC&=~i2c_clk; //0
        i2cwait();
    }
    DDRC|=i2c_data;  //设置data为输出
	PORTD=0x20;
	
    return temp12;
}

void sendacknowledge(uchar flagtemp){
     if (flagtemp){PORTC|=i2c_data;}else{PORTC&=~i2c_data;}
     PORTC|=i2c_clk; //1
     i2cwait();
     PORTD&=~i2c_clk;//0
}
/*
	E2PROM_write(地址,数据),写一个字节数据

*/
void E2PROM_write(byte page,byte addr,byte value)
{
	i2cstart();
	i2csentbyte(wr_device_add|(page<<1)); 
    if (flag2data&ack)
	{
		i2cstop();
        return;
    }	
    i2csentbyte(addr);
	
    if (flag2data&ack)
	{
        i2cstop();
		TxBuf(flag2data); 
        return;
    } 
	
    i2csentbyte(value);
    if (flag2data&ack)
	{
        i2cstop(); 
        return; 
    }
    i2cstop();
	delay_ms(1);
}

byte E2PROM_Page_write(byte page,byte addr,byte *value,byte len)
{
	byte e2paddr=wr_device_add;
	byte i; 
	e2paddr|=(page<<1);
	i2cstart();
	i2csentbyte(e2paddr); 
    if (flag2data&ack)
	{
		i2cstop();
        return 0;
    }	
    i2csentbyte(addr&0xF0);
	
    if (flag2data&ack)
	{
        i2cstop();
		TxBuf(flag2data); 
        return 0;
    } 
	
    for(i=0;i<len;i++)
	{
		i2csentbyte(*(value+i));
		if (flag2data&ack)
		{
			i2cstop(); 
			return 0; 
		}
	}
    i2cstop();
	delay_ms(1);
	return 1;
}

byte E2prom_Read(byte Page,byte addr)
{
	byte value;
	
	i2cstart();
	i2csentbyte(wr_device_add|(Page<<1));
	i2csentbyte(addr);
	i2cstart();
	i2csentbyte(rd_device_add|(Page<<1));
	
	value=i2creceivebyte();
    sendacknowledge(1);
	i2cstop(); 
    return value;
}


void E2prom_Page_Read(byte Page,byte addr,byte *value)
{
	byte i;
	
	i2cstart();
	i2csentbyte(wr_device_add|(Page<<1));
	i2csentbyte(addr&0xF0);
	i2cstart();
	i2csentbyte(rd_device_add|(Page<<1));
	
	for(i=0;i<15;i++)
	{
		*(value+i)=i2creceivebyte();
		sendacknowledge(0);
	}
	*(value+15)=i2creceivebyte();
	sendacknowledge(1);
	i2cstop(); 
    
}

byte E2prom_8574_Read(void)
{
	byte value;
	
	i2cstart();
	i2csentbyte(wr_8574_add);
	value=i2creceivebyte();
    sendacknowledge(1);
	i2cstop(); 
    return value;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -