基于AVR单片机的SPI接口的25C256(EEPROM)的驱动程序
/**********************************硬件宏定义***********************************/
#define SelectMemory1() (PORTA&=~0X01)
#define DeselectMemory1() (PORTA|=0X01)
#define ClrHoldMemory1() (PORTA&=~(0X01<<2))
#define SetHoldMemory1() (PORTA|=(0X01<<2))
/***********************************初始化SPI***********************************/
void SPI_Masterinit(void)
{
PORTB&=~(0x01<<6); //set bit MISO
PORTB&=~0xa0; // clear bits MOSI, & SCK
DDRA=0xff;
DDRB|=0xa0; // Set SCK, MOSI & SS as outputs
//SPCR=BIT(MSTR)|BIT(SPR1)|BIT(CPOL)|BIT(CPHA);
SPSR=0x01;
}
/*****************************SPI数据传递函数***********************************/
void SPI_WriteByte(unsigned char data)
{
SPDR = data; // 启动数据传输
while(!(SPSR & (1<
}
unsigned char SPI_ReadByte(void)
{
SPDR = 0x00;
while(!(SPSR & (1<
return SPDR; //返回数据
}
/******************************25C256初始化*************************************/
void eeprom_Init(void)
{
SetHoldMemory1();
SelectMemory1(); //片选eeprom
SPI_WriteByte(0x06);
DeselectMemory1(); //取消片选eeprom
}
/*******************************读字节函数**************************************/
unsigned char ReadData(unsigned int address)
{
unsigned char buffer;
unsigned char addressH;
unsigned char addressL;
addressH =((unsigned char *)&address)[1]; //取出双字节的高8位
addressL =((unsigned char *)&address)[0]; //取出双字节的低8位
SelectMemory1(); //片选eeprom
SPI_WriteByte(0x03); //发送读eeprom指令
SPI_WriteByte(addressH); //发送地址高8位
SPI_WriteByte(addressL); //发送地址低8位
buffer=SPI_ReadByte(); //接受8位的数据
DeselectMemory1(); //取消片选eeprom
return buffer;
}
/*****************************写字节函数****************************************/
void WritEDAta(unsigned int address,unsigned char data)
{
unsigned char addressH;
unsigned char addressL;
SelectMemory1(); //片选eeprom
SPI_WriteByte(0x06); //写使能
DeselectMemory1(); //取消片选eeprom
addressH =((unsigned char *)&address)[1]; //取出双字节的高8位
addressL =((unsigned char *)&address)[0]; //取出双字节的低8位
SelectMemory1(); //片选eeprom
SPI_WriteByte(0x02); //发送写eeprom指令
SPI_WriteByte(addressH); //发送地址高8位
SPI_WriteByte(addressL); //发送地址低8位
SPI_WriteByte(data); //发送8位的数据
DeselectMemory1(); //取消片选eeprom
delay_ms(5);
}
关键字:AVR单片机 SPI接口 25C256
引用地址:
基于AVR单片机的SPI接口的25C256
推荐阅读最新更新时间:2024-03-16 15:16
AVR单片机的ISP全攻略+熔丝补救方
并行编程,最早的编程方法,功能最强大,但需要连接较多的引脚,通常需要12V~24V的高压,以示区别,下面称为 高压并行编程。 ISP(In System Programmability) 在系统编程,简称为 串行下载 IAP(In Application Programing) 在应用编程,BootLoader也是类似的意思 1 ISP虽然利用了SPI接口(例外:M64/M128为UASRT0接口,Tiny13等没有SPI接口)的引脚,但只在复位时起作用,而且下载完成后合格的下载器会自动断开端口的连接,对正常工作时没有影响的( 在产品应用中,下载器一定是不会一直粘在上面的)。 2 虽然高压并行下载能修复任何熔丝位,但对于贴片封
[单片机]
STM32 SPI接口的简单实现
通常SPI通过4个引脚与外部器件相连: ● MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。 ● MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。 ● SCK:串口时钟,作为主设备的输出,从设备的输入 ●NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为 片选引脚 ,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。一旦被使能(SSOE位),NSS引脚也可以作为输出引脚,并在SPI处于主模式时拉低;此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS引脚
[单片机]
AVR单片机入门系列(17)AVR IO输入之矩阵按键扫描程序
系统功能 使用AVR扫描4*4矩阵按键,一旦扫描到按键被按,做出被按的按键号指示。 硬件设计 关于AVR的I/O结构及相关介绍详见Datasheet,这里仅对作部分简单介绍,下面是AVR的I/O引脚配置表: AVR I/O 口引脚配置表 DDRXn PORTXn PUD I/O 方式 内部上拉电阻 引脚状态说明 0 0 X 输入 无效 三态(高阻) 0 1 0 输入 有效 外部
[单片机]
AVR单片机EEPROM学习
生活中我们经常会犯眼高手低的毛病,很多东西看着别人弄很容易,但轮到自己的时候就会发现其实没有想象中的简单。学完51单片机时,我以为小小的单片机无非就是进行一些IO口的控制罢了,但今天在进行AVR系列单片机学习的时候,才发现原来单片机还有很多的不同,自己原来掌握的东西还远远不足,所以无论到什么时候只有虚心学习,不断努力才能真正的掌握一门技术,学习的过程也是自己人格丰富的过程。下面来说说对EEPROM学习的一些感受。 AVR单片机内部已集成了512kb的EEPROM,对EEPROM的操作比51单片机相对简单一些。写EEPROM操作: 读操作: 主函数将记录打开开发板的次数,将开机数送EEPROM保存,开机后使用LED显示开
[单片机]
基于AVR单片机的轻触式单键开关电路设计
引言: 单键开关电路已经广泛应用于PDA、手机和电子词典等数码产品中,其实现方式多种多样。一般可采用RS触发器、计数器以及采用555集成电路等等。在单片机的一些实际应用中,以上的实现方式会增加整个电路的复杂度,不能达到简洁、实用的效果。本文将介绍一种可以在单片机应用中实现的,简易、稳定的轻触式单键开关电路。 1 电路原理 如图1所示,DC-DC为一个带有关断控制端的直流稳压电源芯片,MCU是一个单片机。当按下S1时,Q1和D1导通,稳压芯片工作,为单片机供电。单片机马上将相应的I/O引脚置为输出高,这时Q1和Q2导通,整个电路进入工作状态。而后单片机再将这个I/O引脚设置为输入,由于上拉电阻R4的存在,Q1和Q2一直导通。
[单片机]
avr单片机编程的c语言问题总结
这两天在用AVR单片机做项目,这次是边做边深入学,尽量将以前忽略的知识用上,比如指针、文件包含、条件编译、变量作用域等一一调研清楚。收获不少,再次体会到学习的过程中没有无用的地方。用的越深入,才发现学时以为没用的东西都是最有用的,因为都被忽略了。幸亏学习时候的最重要的《c程序设计》还在,全能解决,所以遇到问题就问“谭浩强”。如果不能解决,就找编译器的问题。这是这段时间总结的经验。 一、函数指针 1.int (*func)(void)--基本函数指针变量定义方式,变量func是一个指向返回值为int,没有参数的函数指针,这与其他变量定义有点区别,一般是把变量名放最后,如int a,而函数指针比较不直观, 2.typedef
[单片机]
AVR单片机学习(五)按键与数码管的程序设计
按键与数码管的程序设计 AVR IO口的输入模式与上拉电阻 选择结构语句与按键的查询方式程序设计 数码管基本原理 扫描方式显示多位数码管 一、输入状态IO寄存器设置 1、DDRx 某一位置0,相应位的IO口被设置为输入 2、PORTx某一位置1,使能对应IO口相应位的上拉电阻 3、PINx的对应位是输入的数据,0或1 选择结构语句 一、关系运算符和关系表达式 小于 小于等于 = 大于 大于或等于== 不等于!= 二、逻辑运算符和逻辑表达式 逻辑与&&逻辑或||逻辑非! 三、if 语句结构 if(表达式1)语句1 else if(表达式2)语句2 else 语
[单片机]
AVR单片机的RC5和RC6算法比较与改进
摘要:RC5及RC6是两种新型的分组密码。AVR高速嵌入式单片机功能强大,在无线数据传输应用方面很有优势。本文基于Atmega128高速嵌入式单片机,实现RC5和RC6加密及解密算法,并对算法进行汇编语言的优化及改进。根据实验结果。对两种算法的优热点进行比较和分析。
关键词:Atmega128 RC5 RC6 分组密码 混合密钥 Flash
引言
在无线局域网中,传输的介质主要是无线电波和红外线,任何具有接收能力的窍听者都有可能拦截无线信道中的数据,掌握传输的内容,造成数据泄密。因此,对于无线局域网来说,数据的加密是关键技术之一。
AVR高速嵌入式单片机是8位RISC MCU,执行大多数指令只需一个时钟周期,速度快(8M
[单片机]