📄 serial.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 + -