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

📄 serial.c

📁 ADUC841的AD编程
💻 C
字号:

#pragma CODE DEBUG SYMBOLS OBJECTEXTEND
#include <aduc841.h>
#include <stdio.h>
#include <absacc.h>
#include <string.h>
#include <intrins.h>
#include "Const.h"
#include "Extern.h"
extern void delay_nms(uint count);


void i2c_mastermode(void)	//I2C操作设为主模式
{
	I2CM=1;   
	MDO=1;   
	MCO=1;    
	MDE=1;	 
	MDI=0;	  
}

void i2c_start(void)	//I2C启始
{
	MDE=1;
 	_nop_();
	_nop_();
	_nop_();
	MDO=1;
	_nop_();
	_nop_();
	_nop_();
	MCO=1;	
	_nop_();
	_nop_();
	_nop_();
	MDO=0;
	_nop_();
	_nop_();
	_nop_();
	MCO=0;
	_nop_();
	_nop_();
	_nop_();

}

void i2c_stop (void)//I2C停止
{
	MDE = 1;
	_nop_();
	_nop_();
	_nop_();
	MDO = 0;
	_nop_();
	_nop_();
	_nop_();
	MCO = 1;
	_nop_();
	_nop_();
	_nop_();
	MDO = 1;
}

bit i2c_tx_byte(unsigned char TxData)//I2C写
{
	bit ack;
	MDE=1;
 	_nop_();
	if(TxData & 0x80)
        MDO = 1;
    else
        MDO = 0;
	_nop_();
	MCO = 1;
	TxData = TxData << 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	MCO = 0;	//1
	_nop_();
	
	if(TxData & 0x80)
        MDO = 1;
    else
        MDO = 0;
	_nop_();
	MCO = 1;
	TxData = TxData << 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	MCO = 0;	//2
	_nop_();

	if(TxData & 0x80)
        MDO = 1;
    else
        MDO = 0;
	_nop_();
	MCO = 1;
	TxData = TxData << 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	MCO = 0;	//3
	_nop_();

	if(TxData & 0x80)
        MDO = 1;
    else
        MDO = 0;
	_nop_();
	MCO = 1;
	TxData = TxData << 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	MCO = 0;	//4
	_nop_();
	
	if(TxData & 0x80)
        MDO = 1;
    else
        MDO = 0;
	_nop_();
	MCO = 1;
	TxData = TxData << 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	MCO = 0;	//5
	_nop_();

	if(TxData & 0x80)
        MDO = 1;
    else
        MDO = 0;
	_nop_();
	MCO = 1;
	TxData = TxData << 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	MCO = 0;	//6
	_nop_();

	if(TxData & 0x80)
        MDO = 1;
    else
        MDO = 0;
	_nop_();
	MCO = 1;
	TxData = TxData << 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	MCO = 0;	//7
	_nop_();

	if(TxData & 0x80)
        MDO = 1;
    else
        MDO = 0;
	_nop_();
	MCO = 1;
	TxData = TxData << 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	MCO = 0;	//8	
	_nop_();
	_nop_();
	_nop_();

	MDE = 0;
	_nop_();
	_nop_();
	_nop_();
	MCO = 1;
   	_nop_();
    ack = MDI;
	if(ack)
	{
		_nop_();
	}
	_nop_();  
   	MCO =0;
   	return ack;	

}

unsigned char i2c_rx_byte(void)//I2C读
{
   	unsigned char xdata RxData;
 	RxData = 0;
	MDE = 0;
 	_nop_();

	MCO = 1;
	_nop_();
    if(MDI == 1)//1
    {
        RxData =(RxData<<1)+ 1;
    }
    else
    {
 	 	RxData = RxData << 1;
    }
	  MCO = 0;
    _nop_();
	_nop_();
	_nop_();
    _nop_();
	_nop_();
	_nop_();

	
	MCO = 1;
	_nop_();
	if(MDI == 1)//2
    {
         RxData = (RxData << 1) + 1;
    }
    else
    {
         RxData = RxData << 1;
    }
	MCO = 0;
    _nop_();
	_nop_();
	_nop_();
    _nop_();
	_nop_();
	_nop_();


	MCO = 1;
	_nop_();
 	if(MDI == 1)//3
    {
         RxData = (RxData << 1) + 1;
    }
    else
    {
         RxData = RxData << 1;
    }

    MCO = 0;
    _nop_();
    _nop_();
 	_nop_();
    _nop_();
	_nop_();
	_nop_();


	MCO = 1;
	_nop_();
	if(MDI == 1)//4
    {
         RxData = (RxData << 1) + 1;
    }
    else
    {
         RxData = RxData << 1;
    }

    MCO = 0;
    _nop_();
	_nop_();
	_nop_();
    _nop_();
	_nop_();
	_nop_();


	MCO = 1;
	_nop_();
	if(MDI == 1)//5
    {
         RxData = (RxData << 1) + 1;
    }
    else
    {
         RxData = RxData << 1;
    }
	
    MCO = 0;
    _nop_();
	_nop_();
	_nop_();
    _nop_();
	_nop_();
	_nop_();


	MCO = 1;
	_nop_();
	if(MDI == 1)//6
    {
         RxData = (RxData << 1) + 1;
    }
    else
    {
         RxData = RxData << 1;
    }
	
    MCO = 0;
	_nop_();
    _nop_();
	_nop_();
    _nop_();
	_nop_();
	_nop_();


	MCO = 1;
	_nop_();
	if(MDI == 1)//7
    {
         RxData = (RxData << 1) + 1;
    }
    else
    {
         RxData = RxData << 1;
    }
    MCO = 0;
	_nop_();
    _nop_();
	_nop_();
    _nop_();
	_nop_();
	_nop_();


	MCO = 1;
	_nop_();
	if(MDI == 1)//8
    {
         RxData = (RxData << 1) + 1;
    }
    else
    {
         RxData = RxData << 1;
    }
    MCO = 0;
	_nop_();
    _nop_();
   	_nop_();
    _nop_();
	_nop_();
	_nop_();


	MCO = 1;
    _nop_();
	_nop_();
    _nop_();
   	_nop_();
    _nop_();
	_nop_();
	_nop_();
    MCO = 0;
    _nop_();
	return (RxData);
}

void write_infomation(unsigned char i2c_addr,unsigned char i2c_value)//存储信息
{
	unsigned char xdata addr_h,addr_l;
	delay_nms(4);
	addr_h = i2c_addr / 256;
	addr_l = i2c_addr % 256;	
	while(1)
	{
		i2c_start();			
		if(i2c_tx_byte(EPROM_SLA_ADDR) == 0x01)//选择芯片
        {
        	i2c_stop();
           	continue;
       	}
       	if(i2c_tx_byte(addr_h) == 0x01)//高位地址
        {
        	i2c_stop();
           	continue;
       	}
       	if(i2c_tx_byte(addr_l) == 0x01)//低位地址
       	{
         	i2c_stop();
           	continue;
       	}
       	if(i2c_tx_byte(i2c_value) == 0x01)//带宽数据
       	{
           	i2c_stop();
        	continue;
       	}
       	i2c_stop();
       	break;
	}	
	delay_nms(1);		
}

void read_infomation(unsigned char i2c_addr)//读取信息
{
	unsigned char xdata addr_h,addr_l,read_data;
	delay_nms(4);	
	while(1)
	{
		i2c_start();
		addr_h = i2c_addr / 256;
		addr_l = i2c_addr % 256;

		if(i2c_tx_byte(EPROM_SLA_ADDR) == 0x01)//选择芯片
    	{
    		i2c_stop();
       		continue;
    	}
    	if(i2c_tx_byte(addr_h) == 0x01)//高位地址
    	{
    		i2c_stop();
    	   	continue;
   		}
   		if(i2c_tx_byte(addr_l) == 0x01)//低位地址
   		{
    	 	i2c_stop();
    	   	continue;
   		}
   		i2c_start();
		if(i2c_tx_byte(EPROM_SLA_ADDR + 0x01) == 0x01)
    	{
    		i2c_stop();
    	   	continue;
    	}
   		read_data = i2c_rx_byte();
   		i2c_stop();
    	break;
	}	
	return (read_data);
}


void write_eprom(unsigned char type,unsigned int port ;unsigned char port_data[16])
{
	unsigned char xdata addr_h,addr_l,temp,length,eprom_page;
	delay_nms(10);
	eprom_page = 0
	if(type == IP_FLAG)
	{
		if(port < 4)
		{
			head_addr = IP_ADDR
			length = 6;
		}
		else
		{
			return (ERROR);
		}
	}
	else if(type == AT4_NAME_FLAG)
	{
		if(port < 96)
		{
			head_addr = AT4_NAME_ADDR
			length = 16;
		}
		else
		{
			return (ERROR);
		}
	}
	else if(type == R_PHONE_FLAG)
	{
		length = 12;
		if(port < ACCOUNT_FLAG)
		{
			head_adde = USEING_ADDR
		}
		elae if(port < 10000)
		{
			head_addr = 0
			port = port -  ACCOUNT_FLAG;
			eprom_page = 0x02;
		}
		else
		{
			return (ERROR);
		}
	}
	addr_h = (head_addr + port * length) / 256;
	addr_l = (head_addr + port * length) % 256;
	if(type == R_PHONE)
	{
		if(port < R_PHONE_MIX)
		{
			length = 12;
			addr_h = (65536 - (port + 1) * length) / 256;
			addr_l = (65536 - (port + 1) * length) % 256;
			eprom_page = 0x02;
		}
		else
		{
			retuen(ERROR);
		}
	}	
	while(1)
	{
		RUN_LED = !RUN_LED;
		i2c_start();
		if(i2c_tx_byte(EPROM_SLA_ADDR + eprom_page) == 0x01)//选择芯片
	   	{
	   		i2c_stop();
	   		continue;
	    }
	    if(i2c_tx_byte(addr_h) == 0x01)//高位地址
	    {
	    	i2c_stop();
	       	continue;
	   	}
	   	if(i2c_tx_byte(addr_l) == 0x01)//低位地址
	   	{
	     	i2c_stop();
	       	continue;
	   	}
	   	for(temp = 0;temp < length; temp++)
	   	{
	   		if(i2c_tx_byte(port_data[temp] & 0xff) == 0x01)
       		{
           		i2c_stop();
           		continue;
       		}
       	}
	}
	delay_nms(20);
	retuen(RIGHT);
}

unsignes char count_eprom_addr(unsigned char type,unsigned int port)
{
	unsigned char xdata head_addr,eprom_page,length_read;
	eprom_page = 0;
	delay_nms(10);
	switch (type)													//非信息包类型
	{
		case IP_FLAG:
		{
			if(port < 4)
			{
				head_addr = IP_ADDR;
				length_read = 6;
			}
			else
			{
				return (ERROR);
			}
		}
		break;
		case AT4_NAME_FLAG:
		{
			if(port < 96)
			{
				head_addr = AT4_NAME_ADDR;
				length_read = 16;
			}
			else
			{
				return (ERROR);
			}
		}
		break;
		case ACCOUNT_FLAG:
		{
			length_read = 12;
			if(port < ACCOUNT_FLAG)
			{
				head_addr = USEING_ADDR;
				
			}
			else if(port < 10000)
			{
				port = port -  ACCOUNT_FLAG;
				head_addr = 0;
				eprom_page = 0x02;
			}
			else
			{
				return (ERROR);
			}
		}
		break;
		case R_PHONE_FLAG:
		{
			if(port < R_PHONE_MIX)
			{
				length_read = 12;
				eprom_page = 0x02;
			}
			else
			{
				retuen(ERROR,eprom_page);
			}
		}
		break;
		case DT_FLAG
		{
			length_read = 64;
			head_addr = DT_STATE_ADDR;
		}
		break;
		default
		break;
	}		
	read_eprom(type,port,length,head_addr,)
	delay_nms(20);
	retuen(RIGHT);
}

unsigned char read_eprom(unsigned char read_type,unsigned int read_port,unsigned char read_length,unsigned char read_head_addr,unsigned char read_eprom_page)
{
	unsigned char temp_read,eprom_page,head_addr,port_data[16],length_temp;
	length_temp = 1;
	if(read_length == 64)
	{
		length_temp = 48;
	}
	for(temp_read = 0;temp_read < length_temp;length_temp++)
	{
		for(temp = 0; temp < read_length; temp++)
		{
			while(1)
			{
				RUN_LED = !RUN_LED;
				i2c_start();
				addr_h = (read_head_addr + read_port * read_length + temp + temp_read* 64) / 256;
				addr_l = (read_head_addr + read_port * read_length + temp + temp_read* 64) % 256;
				if(read_type == R_PHONE)
				{
					addr_h = (65536 - (read_port + 1) * read_length + temp) / 256;
					addr_l = (65536 - (read_port + 1) * read_length + temp) % 256;
				}
				if(i2c_tx_byte(EPROM_SLA_ADDR + eprom_page) == 0x01)//选择芯片
			   	{
			   		i2c_stop();
			   		continue;
			    }
			    if(i2c_tx_byte(addr_h) == 0x01)//高位地址
			    {
			    	i2c_stop();
			       	continue;
			   	}
			   	if(i2c_tx_byte(addr_l) == 0x01)//低位地址
			   	{
			     	i2c_stop();
			       	continue;
			   	}
			   	if(i2c_tx_byte(EPROM_SLA_ADDR + 0x01 + read_eprom_page) == 0x01)//选择芯片
			   	{
			   		i2c_stop();
			   		continue;
			    }
			    if(read_length == 64)
			    {
			    	slot_state_data[temp + temp_read* 64] = i2c_rx_byte();
			    }
			    else
			    {
			    	port_data[temp] = i2c_rx_byte();
				}
			}
		}
	}
	delay_nms(20);
	retuen(RIGHT);
}

⌨️ 快捷键说明

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