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

📄 driver.c

📁 用avr mega128读取spi串行字库
💻 C
📖 第 1 页 / 共 5 页
字号:
#include <iom128v.h>
#include <macros.h>

#include "define.h"
#include "define_variable.h"
#include "driver.h"
//*******************************************************************************************
//驱动程序,包括:45DB041读写操作、读写内部eeprom的驱动、液晶的驱动、无线接收的驱动、
//串口驱动、键盘扫描、字库读取、常用的子程序、MCU上电初始化、100us定时器中断
//eeprom空间分配:本机号码-0-16 存放是否取消按键音-17
//通话纪录:51-250 共存10条通话纪录,每条20个字节
//短信息:251-3250  共存15条短信息,每条200个字节
//*******************************************************************************************

//*******************************一些常用的子程序*********************************************//

//******************************************************
//看门狗喂狗子程序
//******************************************************
void CLEAR_WATCHDOG(void)
{
	if((currency_flag&RESET_PROGRAME_CURRENCY_F) == 0)
	{
		if( PORTB&WDI )
		{
			PORTB &=~WDI;		//如果是高电位,则翻转为低电位
		}
		else
		{
			PORTB |=WDI;		//如果是低电位,则翻转为高电位
		}
	}
}
//******************************************************
//将ASCII字符转换为16进制的数
//for example:input_h=0x31,input_l=0x32,the result=12
//******************************************************
unsigned char ASCIITOHEX( unsigned char input_h,unsigned char input_l )
{
    if(( input_h>0x40 )&&(input_h<0x47)) 
    {
    	input_h=input_h-0x37;
    }
    else if(( input_h>0x60 )&&(input_h<0x67))
    {
    	input_h=input_h-0x57;
    }
    else 
    {
    	input_h=input_h-0x30;
    }
    if(( input_l>0x40 )&&(input_l<0x47)) 
    {
    	input_l=input_l-0x37;
    }
    else if(( input_l>0x60 )&&(input_l<0x67))
    {
    	input_l=input_l-0x57;
    }
    else 
    {
    	input_l=input_l-0x30;
    }
    return( input_h*16+input_l );
}
//********************************************************
//将一个数转换ASCII数值
//example:数值1 to 0x31
//********************************************************
unsigned char ASCII(unsigned char input)
{
	if(input > 9)
	{
		return(input + 0x37);
	}
	else
	{
		return(input + 0x30);
	}
}
//********************************************************
//延时子程序
//FUNCTION:100us延时
//********************************************************
void DELAY_TIME(unsigned int count)
{
	unsigned int i;
	for(i=0;i<count;i++)
	{
	}
	//while(time < count)
	//{
		//CLEAR_WATCHDOG();
	//}
}
//********************************************************
//将8个数写入single8[8]中
//********************************************************
void ADD_NUMBER_TO_SINGLE(unsigned char num_0,unsigned char num_1,unsigned char num_2,unsigned char num_3,unsigned char num_4,unsigned char num_5,unsigned char num_6,unsigned char num_7)
{
	single8[0]=num_0;
	single8[1]=num_1;
	single8[2]=num_2;
	single8[3]=num_3;
	single8[4]=num_4;
	single8[5]=num_5;
	single8[6]=num_6;
	single8[7]=num_7;
}
//******************************对内部EEPROM的操作************************************//

//********************************************************
//向AVR单片机内部EEPROM中指定位置写入数据
//********************************************************
void EEPROM_WRITE(unsigned int address, unsigned char data)
{
	/* 等待上一次写操作结束 */
	while(EECR & (1<<EEWE));
	/* 设置地址和数据寄存器 */
	EEAR = address;
	EEDR = data;
	/* 置位EEMWE */
	EECR |= (1<<EEMWE);
	/* 置位EEWE 以启动写操作E */
	EECR |= (1<<EEWE);
}
//********************************************************
//读出AVR单片机内部EEPROM中指定位置的数据
//********************************************************
unsigned char EEPROM_READ(unsigned int address)
{
	/* 等待上一次写操作结束 */
	while(EECR & (1<<EEWE));
	/* 设置地址寄存器 */
	EEAR = address;
	/* 设置EERE 以启动读操作 */
	EECR |= (1<<EERE);
	/* 自数据寄存器返回数据 */
	return EEDR;
}

//**************************对外部串行EEPROM-45DB041的读写驱动****************************************//

//*******************************************
//初始化SPI
//*******************************************
void SPI_INITIALIZE(void)
{
	/*	设置MOSI和SCK为输出,其他为输入 */
	//DDRB = (1<<DDB2)|(1<<DDB1);
	/*	使能SPI为主机模式,设置时钟为fck/16,SPI工作模式选择为模式3 */
	SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR0);
	SEND_COM1_AT((const unsigned char *)SPI_INIT_RUN,sizeof(SPI_INIT_RUN) );

	
}

//********************************************
//向外部EEPROM送一个字节数据
//********************************************
void SPI_TRANSBYTE(unsigned char data)
{
	/*	启动数据传输	*/
	SPDR = data;
	/*	等待传输结束	*/
	while(!(SPSR & (1<<SPIF)));
}

//********************************************************
//读主存储区一个页的数据到buffer1
//********************************************************
void READ_ONE_PAGE_TO_BUFFER1(unsigned int pageaddress)
{
	PORTE &=~0x80;
	SPI_TRANSBYTE(0x53);
	SPI_TRANSBYTE((char)(pageaddress>>7));
	SPI_TRANSBYTE((char)(pageaddress<<1));
	SPI_TRANSBYTE(0x00);
	PORTE |=0x80;
}

//********************************************************
//读主存储区一个页的数据到buffer2
//********************************************************
void READ_ONE_PAGE_TO_BUFFER2(unsigned int pageaddress)
{
	PORTE &=~0x80;
	SPI_TRANSBYTE(0x55);
	SPI_TRANSBYTE((char)(pageaddress>>7));
	SPI_TRANSBYTE((char)(pageaddress<<1));
	SPI_TRANSBYTE(0x00);
	PORTE |=0x80;
}

//********************************************************
//在buffer1中的一个指定地址读一个字节的数据
//********************************************************
unsigned char READ_BYTE_FROM_BUFFER1(unsigned int byteaddress)
{
	PORTE &=~0x80;
	SPI_TRANSBYTE(0x54);
	SPI_TRANSBYTE(0x00);
	SPI_TRANSBYTE((char)(byteaddress>>8));
	SPI_TRANSBYTE((char)byteaddress);
	SPI_TRANSBYTE(0x00);
	SPI_TRANSBYTE(0xFF);
	PORTE |=0x80;
	return SPDR;
}

//********************************************************
//在buffer2中的一个指定地址读一个字节的数据
//********************************************************
unsigned char READ_BYTE_FROM_BUFFER2(unsigned int byteaddress)
{
	PORTE &=~0x80;
	SPI_TRANSBYTE(0x56);
	SPI_TRANSBYTE(0x00);
	SPI_TRANSBYTE((char)(byteaddress>>8));
	SPI_TRANSBYTE((char)byteaddress);
	SPI_TRANSBYTE(0x00);
	SPI_TRANSBYTE(0xFF);
	PORTE |=0x80;
	return SPDR;
}

//********************************************************
//在buffer1中的一个指定的地址写一个字节
//********************************************************
void WRITE_ONE_BYTE_TO_BUFFER1(unsigned int byteaddress,unsigned char writeonebyte )
{
	PORTE &=~0x80;
	SPI_TRANSBYTE(0x84);
	SPI_TRANSBYTE(0x00);
	SPI_TRANSBYTE((char)(byteaddress>>8));
	SPI_TRANSBYTE((char)byteaddress);
	SPI_TRANSBYTE(writeonebyte);
	PORTE |=0x80;
}

//********************************************************
//在buffer2中的一个指定的地址写一个字节
//********************************************************
void WRITE_ONE_BYTE_TO_BUFFER2(unsigned int byteaddress,unsigned char writeonebyte )
{
	PORTE &=~0x80;
	SPI_TRANSBYTE(0x87);
	SPI_TRANSBYTE(0x00);
	SPI_TRANSBYTE((char)(byteaddress>>8));
	SPI_TRANSBYTE((char)byteaddress);
	SPI_TRANSBYTE(writeonebyte);
	PORTE |=0x80;
}

//********************************************************
//将buffer1中的数据写入主存储区一个指定的页,
//前提条件是buffer1中确定是需要写入的数据
//********************************************************
void WRITE_BUFFER1_TO_PAGE(unsigned int pageaddress)
{
	PORTE &=~0x80;
	SPI_TRANSBYTE(0x83);
	SPI_TRANSBYTE((char)(pageaddress>>7));
	SPI_TRANSBYTE((char)(pageaddress<<1));
	SPI_TRANSBYTE(0x00);
	PORTE |=0x80;
}


//********************************************************
//将buffer2中的数据写入主存储区一个指定的页,
//前提条件是buffer2中确定是需要写入的数据
//********************************************************
void WRITE_BUFFER2_TO_PAGE(unsigned int pageaddress)
{
	PORTE &=~0x80;
	SPI_TRANSBYTE(0x86);
	SPI_TRANSBYTE((char)(pageaddress>>7));
	SPI_TRANSBYTE((char)(pageaddress<<1));
	SPI_TRANSBYTE(0x00);
	PORTE |=0x80;
}


//********************************************************
//擦除一页
//********************************************************
void ERASE_ONE_PAGE(unsigned int pageaddress)
{
	PORTE &=~0x80;
	SPI_TRANSBYTE(0x81);
	SPI_TRANSBYTE((char)(pageaddress>>7));
	SPI_TRANSBYTE((char)(pageaddress<<1));
	SPI_TRANSBYTE(0x00);
	PORTE |= 0x80;
}
//*************************************
//保护引脚置高,保护Flash中内容
//*************************************
void OPR_SPI_END(void)
{
	PORTE |= 0x80;
}
//*************************************
//保护引脚置低,允许修改Flash中内容
//*************************************
void OPR_SPI_START(void)
{
	PORTE &=~0x80;
}


//**************************************串口驱动*************************************************//

//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
//********************************************************************
//串口0初始化
//********************************************************************
void UART0_INITIALIZE(void)
{
	UCSR0B = 0x00; //disable while setting baud rate
	UCSR0A = 0x00;
	UCSR0C = 0x06;
	UBRR0L = 0x33; //set baud rate lo
	UBRR0H = 0x00; //set baud rate hi
	UCSR0B = 0x98;
}

//*******************************************************************
//串口0中断子程序
//receive0_buffer[512]分成两部分,分别存放接收到的两个命令
//命令格式0x24,0x04,0x00,0x0d
//*******************************************************************
void UART0_RX_ISR(void)
{
	unsigned char c = 0;
	c = UDR0;
	if(start_receive_com0_data==1)//开始存数据,根据包长度来存
	{
		receive0_buffer[receive0_buffer_point]=c;
		receive0_buffer_point++;
		if(receive0_buffer_point==receive0_buffer[1])
		{
			start_receive_com0_data=0;
			receive0_buffer_over=1;
			receive0_buffer_point=0;
		}
	}
	else if(start_receive_com0_length==1)
	{
		receive0_buffer[1]=c;  //存包长度
		receive0_buffer_point=2;
		start_receive_com0_length=0;
		start_receive_com0_data=1;
	}
	else if(c==0x24)
	{
		receive0_buffer[0]=c;   //存包头
		start_receive_com0_length=1;
	}

}
//*************************************************
//串口0发送1byte
//*************************************************
void USART0_TRANSMIT( unsigned char data )
{
	//等待发送缓冲器为空 
	while ( !( UCSR0A & (1<<UDRE0)) );
	//将数据放入缓冲器,发送数据
	UDR0 = data;
}

//UART1 initialisation
// desired baud rate:9600
// actual baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
//******************************************************************
//串口1初始化
//******************************************************************
void UART1_INITIALIZE(void)
{
	UCSR1B = 0x00; //disable while setting baud rate00
	UCSR1A = 0x00;//00
	UCSR1C = 0x06;//00
	UBRR1L = 0x33; //set baud rate lo
	UBRR1H = 0x00; //set baud rate hi
	UCSR1B = 0x98;//98
}
//******************************************************************
//串口1中断子程序
//******************************************************************
void UART1_RX_ISR(void)
{
	//uart has received a character in UDR
	uart1_rec = UDR1;
}
//*******************************************************************
//串口1发送1byte
//*******************************************************************
void USART1_TRANSMIT( unsigned char data )
{
	// 等待发送缓冲器为空 
	while ( !( UCSR1A & (1<<UDRE1)) );
	// 将数据放入缓冲器,发送数据
	UDR1 = data;
}

//********************************************************
//通过串口0发送一个字节
//********************************************************
void SEND_COM0_BYTE(unsigned char input)
{
	USART0_TRANSMIT(input);
}

//********************************************************
//通过串口0发送一个字符串
//********************************************************
void SEND_COM0_STRING(unsigned char *point,unsigned int count)
{
	while(count > 0)
	{
		USART0_TRANSMIT(*point);
		point++;
		count--;
	}
}
//********************************************************
//通过串口0发送一个const字符串
//********************************************************
void SEND_COM0_AT(const unsigned char *point,unsigned int count)
{
	while(count>0)
	{
		USART0_TRANSMIT(*point);
		point++;
		count--;
	}
}

//********************************************************
//通过串口1发送一个字节
//********************************************************
void SEND_COM1_BYTE(unsigned char input)
{
	USART1_TRANSMIT(input);
}

//********************************************************
//通过串口1发送一个字符串
//********************************************************
void SEND_COM1_STRING(unsigned char *point,unsigned int count)
{
	while(count>0)
	{
		USART1_TRANSMIT(*point);
		point++;
		count--;
	}
}
//********************************************************
//通过串口1发送一个const字符串
//********************************************************
void SEND_COM1_AT(const unsigned char *point,unsigned int count)
{
	while(count>0)
	{
		USART1_TRANSMIT(*point);
		point++;
		count--;
	}
}
//**************************************初始化MCU配置,以及定时器的设置*******************************************//

//******************************************************************
//初始化AVR的寄存器,IO端口方向,串口波特率等
//******************************************************************
void MCU_INITIALIZE(void)								
{

⌨️ 快捷键说明

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