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

📄 soc_test._c

📁 atmega128串口通信
💻 _C
📖 第 1 页 / 共 2 页
字号:
#include  <iom128v.h>
//单片机ATmega128
#include  <macros.h>
//单片机ATmega128
#include  "soc_test.H"
//对应头文件
//寄存器更名
asm(".define  temp   R16");
//--------------------------------------------------------
/*********************************************************
连续5个NOP
*********************************************************/
void	NOP5(void)
{
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
}
//--------------------------------------------------------
/*********************************************************
初始化程序	
*********************************************************/
void	initial_work(void)
{
	/*********************************
  					初始化IO口
  *********************************/
  //初始化B口
  //DDRB|=BIT(FQUD)+BIT(RESET)+BIT(RESET_FPGA)+BIT(W_CLK)+BIT(SDATA);
  //初始化D口
  //DDRD|=BIT(INT_DSP);  
  //初始化E口
  DDRE|=BIT(NBUS_CLK)+BIT(BUSWEN)+BIT(SAMPLE_START)+BIT(MCUREAD_START);
	
  /*********************************
  *********************************/
  NOP5();
  /*********************************
  					初始化串口												
  *********************************/
	UCSR0B=0x00;
	UCSR0A=0x00;
	UCSR0C=0x06; //8bit,1 stop bit,no check
	UBRR0L=0x0B; //现:设置波特率为38.4Kbps(外部晶振时钟7372.8KHz)
	UBRR0H=0x00;
	UCSR0B=0x98; //一开始就打开发送使能,是为了使TXC脚电平变高
}//end initial_work
//--------------------------------------------------------
/*********************************************************



*********************************************************/
void  process_00workmode(void)
{
	unsigned char i;
	if(1)
	{
		for(i=0;i<L00;i++)
		{
			reply_buffer[i]=work_state_succeed[i];
		}
		usart0_send(L00);
	}
}//end process_00workmode
//--------------------------------------------------------
/*********************************************************
等待
*********************************************************/
void	process_01wait(void)
{
	
}//end process_01wait
//--------------------------------------------------------






/*********************************************************
通用延时子程序
*********************************************************/
void delay1(void)
{
	asm("DELAY1:"); 
	asm("push r16");
	asm("CC0:  push r16");
	asm("CC1:  push r16");
	asm("CC2:  push r16");
	asm("CC3:  dec  r16");
	asm("brne CC3");
	asm("pop r16");
	asm("dec r16");
	asm("brne CC2");
	asm("pop r16");
	asm("dec r16");
	asm("brne CC1");
	asm("pop r16");
	asm("dec r16");
	asm("brne CC0");
	asm("pop r16");    
}//end delay1
//--------------------------------------------------------
/*********************************************************
串口发送查询
*********************************************************/
void  query_TXC(void)
{
	while(!(UCSR0A&BIT(TXC0)));
	UCSR0A|=BIT(TXC0);   //写1清零
}//end query_TXC
//--------------------------------------------------------
/*********************************************************
使能外部SRAM
*********************************************************/
void  enable_XMEM(void)
{
	MCUCR=0b10000000; //XMEM enable,no wait states
	XMCRA=0;
	XMCRB=0;   				//no XMEM high mask
}//end enable_XMEM
//--------------------------------------------------------
/*********************************************************
清串口
*********************************************************/
void  usart_flush(void)
{
	asm("push temp");
	while(UCSR0A&BIT(RXC0))
	{
		asm("in temp,0x0c");   //in temp,udr0
		continue;   //继续判断
	}
	asm("pop temp");
}//end usart_flush
//--------------------------------------------------------


/*********************************************************
通过异步串口0发送回复命令
*********************************************************/
void  usart0_send(unsigned char uSendLen)
{
	unsigned char i=0;
	for(i=0;i<uSendLen;i++)
	{
		UDR0=reply_buffer[i];
		query_TXC();
	}
}//end usart0_send
//--------------------------------------------------------
/*********************************************************
通过异步串口0发送一个字节
*********************************************************/
void  usart0_sendbyte(unsigned char uSendByte)
{
    
  UDR0=uSendByte;
  query_TXC();  
    
}//end usart0_sendbyte
//--------------------------------------------------------
/*********************************************************
**********************************************************
以下为中断服务子程序
**********************************************************
*********************************************************/
//异步串口接收中断处理程序,将所接收命令存于数组buffer[]中
//为防止意外改变寄存器的值,在这里只用全局变量
//每次进中断接收一字节数据
void usart0_receive(void)
{
	unsigned char revChar;
	haveUartInt=0x01;  //haveUartInt表示接收了一次串口中断,即一个字节数据
	revChar=UDR0;	//接收一个字节
	if(buf_index<MAX_RECEV_LEN)	//如果长度小于最大长度
	{
		buffer[buf_index]=revChar;	//将该字节加入buffer
		if(END_WORD==buffer[buf_index] && BEGIN_WORD==beginWord && buf_index>2)
		//这里为beginWord是因为beginWord是在结束字之前设置的,也就是说收到结束字时必须先收到了起始字否则这个结束字是非法的
		{	//注意:结束字判断应该在转义操作之前
			endWord=END_WORD;			//接收到结束标志
			beginWord=0x00;			//接收完一次,为接收下一次数据做准备
		}
		else if(0==buf_index)
		{	//对第一个数据进行判断
			if(BEGIN_WORD==buffer[0])
			{
				beginWord=BEGIN_WORD;	//接收到起始字
			}
			else
			{
				haveError=0x02;			//haveError索引(2),开始字出错
			}
		}
		else if(1==buf_index && BEGIN_WORD==beginWord)
		{	//索引为1,且已经起始
			if(BEGIN_WORD==buffer[1])	//若第二个数据也是起始字,删除一个
			{
				buf_index=0;		//索引变为0
				buffer[1]=0x01;	//清除第二个接收到的起始字
			}
			//判断所收命令是否归本片AVR处理
			else if(ADDRESS_WORD!=buffer[1]) 
			{
				haveError=0x03;   //haveError索引(3),地址不对,重新接收
			}
		}
		else if(haveSpeWord)	//这里用else,是因为第一个字,第二个字都不可能是转义字符
		{//含有转义字符,做转义操作,若数据错误,则设置错误标志,重新接收
			haveSpeWord=0x00;			//清除标志
			if(CHANGE_WORDL1==buffer[buf_index])
			{
				buffer[buf_index-1]=0x7E;	//若是7D 5E -> 7E
				buf_index-=1;			//buf_index减一
			}
			else if(CHANGE_WORDL2==buffer[buf_index])
			{
				buffer[buf_index-1]=0x7D;	//若是7D 5D -> 7D
				buf_index-=1;			//buf_index减一
			}
			else
			{
				haveError=0x04;		//haveError索引(4),转义字符出错
			}
		}
		else if(0x7D==buffer[buf_index])
		{
			haveSpeWord=0x01;			//接收到转义字符
		} 
	}
	else
	{
		haveError=0x01;		//haveError索引(1),超出了接收长度
	}
	//跳出时做错误判断
	if(haveError!=0)				//如果发现有错误
	{	//如果有错误,重新接收
		buffer[0]=0x00;			//第一个字符清零
		buf_index=0;				//buffer索引清零,继续接收
		beginWord=0x00;			//为开始做准备
		endWord=0x00;				//结束字还没收到
		haveSpeWord=0;				//清接收转义字符标志
		haveError=0;				//清错误标志
	}
	else
	{										//若没有错误
		buf_index+=1;					//buffer索引加1
	}
}//end usart0_receive

/*********************************************************
向命令总线写命令数据
*********************************************************/
void  Write_bus_data(short bus_data)
{unsigned char bus_data_L;
 unsigned char bus_data_H;
 bus_data_H = bus_data/256;
 bus_data_L = bus_data%256;
 INSTRUCT_BYTE_LOW = bus_data_L;
 INSTRUCT_BYTE_HIG = bus_data_H;
}//end Write_bus_data
/*********************************************************
向命令总线写命令地址
*********************************************************/
    
void  Write_bus_add(unsigned char bus_add)
{INSTRUCT_ADD = bus_add;
}//end Write_bus_add
/*********************************************************
写控制命令
*********************************************************/
void  send_instruct(short command ,unsigned char address)
{Write_bus_data(command);
 Write_bus_add(address);
 PORTE&=~BIT(BUSWEN);  //BUSWEN置低
 NOP5();
 PORTE|=BIT(BUSWEN);  //BUSWEN置高
 NOP5();
 PORTE&=~BIT(NBUS_CLK);  //NBUS_CLK置低
 NOP5();
 PORTE|=BIT(NBUS_CLK);  //NBUS_CLK置高
 NOP5();
 PORTE&=~BIT(NBUS_CLK);  //NBUS_CLK置低
 NOP5();
 PORTE&=~BIT(BUSWEN);  //BUSWEN置低
 NOP5();
 
}//end send_instruct
/*********************************************************
启动DDC数据采样
*********************************************************/
void start_sample(void)
{PORTE&=~BIT(SAMPLE_START);  //SAMPLE_START置低
 NOP5();
 PORTE|=BIT(SAMPLE_START);  //SAMPLE_START置高
 NOP5();
 NOP5();
 NOP5();
 NOP5();
 NOP5();
 NOP5();
 PORTE&=~BIT(SAMPLE_START);  //SAMPLE_START置低
}//end start_sample

/*********************************************************
启动单片机读DDC采样数据
*********************************************************/
void start_mcuread_sample(void)
{unsigned char temp;
 PORTE&=~BIT(MCUREAD_START);  //MCUREAD_START置低
 NOP5();
 PORTE|=BIT(MCUREAD_START);  //MCUREAD_START置高
 NOP5();
 temp=DDCDATA_ADD;
 NOP5();
 PORTE&=~BIT(MCUREAD_START); //MCUREAD_START置低
}//end start_sample


/*********************************************************
通过串口获取DDC数据
*********************************************************/
void aquire_data(void)
{unsigned char ddc_data;
int cnt;
start_sample();                //启动DDC数据采集
asm("ldi R16,$20");
delay1();                      //延时足够时间保证采样结束
start_mcuread_sample();        //启动MCU读
usart0_sendbyte(0x7E);         //发送起始字
usart0_sendbyte(0x6F);        //发送地址字
ddc_data=DDCDATA_ADD;         //假读一次
for(cnt=0;cnt<8192;cnt++)     //发送数据
{
 ddc_data=DDCDATA_ADD;
 usart0_sendbyte(ddc_data);
}
usart0_sendbyte(0x7E);       //发送结束字
}//end aquire_data

⌨️ 快捷键说明

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