/**************************************
硬件:单片机mega162,EEPROM 25256,晶振3.6864MHZ
编译环境:ICC
****************************************/
#include
#define BAUD 9600 //波特率4800
#define CRYSTAL 3686400 //晶振3M
#define BAUD_set (unsigned int)( (unsigned long)CRYSTAL/
(16*(unsigned long)BAUD)-1 ) //波特率计算
#define BAUD_H (unsigned char)(BAUD_set>>8) //波特率寄存器
#define BAUD_L (unsigned char)(BAUD_set)
/*
//GPRS
#define GPRS_ONOFFH PORTA|=(1<unsigned char *Data,unsigned char NData)
{
unsigned char i;
EEPROM_WREN();
EEPROM_CSL;
SPI_MasterTransmit(0x02);//页写指令
SPI_MasterTransmit(Address/256); //地址高位
SPI_MasterTransmit(Address%256); //地址低位
for(i=0;i//PB1输出1,PB2输出1,PB3输入0,PB4输出1,PB0输出1(用于新终端开关电源控制),
PB5PB7为输出1
PORTC=0xff;
DDRC=0xd0; //PC4输出1,PC6,PC7输出1
PORTD=0xff;
DDRD=0x26; //PD0输入0,PD1输出1,PD5PD2输出1
}
void main(void)
{
// unsigned char dataa,i,j;
SREG=0x80; //开放全局中断
Port_Init();
USART0_Init();
USART1_Init();
// GPRS_On();
SPI_MasterInit();EEPROM_WRSR();
while(1)
{
USART0_Transmit(0x22);
USART0_Transmit(0x33);
EEPROM_ByteWrite(0x2030,0x48); //给25256地址0x2030写入数据0x48
USART0_Transmit(EEPROM_Read(0x2010));
USART0_Transmit(EEPROM_Read(0x2030));
//读出地址0x2030中数据,从串口0发送出来
USART0_Transmit(0x44);
USART0_Transmit(0x55);
USART0_Transmit(EEPROM_RDSR());
EEPROM_PageWrite(0x1001,"456789",6);
//输出结果0xff,0xff,0xff,0x37,0x38,0x39
USART0_Transmit(EEPROM_Read(0x1001));
USART0_Transmit(EEPROM_Read(0x1002));
USART0_Transmit(EEPROM_Read(0x1003));
USART0_Transmit(EEPROM_Read(0x1004));
USART0_Transmit(EEPROM_Read(0x1005));
USART0_Transmit(EEPROM_Read(0x1006));
USART0_Transmit(0x11);
}
}
/* //IAR中中断的写法
#pragma vector=USART0_RXD_vect
__interrupt void Usart0Rx(void)
{
unsigned char dataa;
dataa=UDR0;
usart0_transmit(dataa);
}
*/
//串行0通信接收完成中断\
//ICC中中断的写法
#pragma interrupt_handler USART0Rx:20
void USART0Rx()
{
unsigned char data0;
data0=UDR0;
USART0_Transmit(data0);
}
/*串行1通信接收完成中断
分析灯不亮原因,开了串口1中断,但是没有加入中断函数,导致其他地方不能工作。
串口中断0能执行,是由于其优先级比串口中断1高
以下是书上的说法:
接收结束标志位(RXC)用来说明接收缓冲器中是否有未读出的数据。
当接收缓冲器中有未读出的
数据时,此位为1,当接收缓冲器空时为0(即不包含未读出的数据)。
如果接收器被禁止(RXEN=0),
接收缓冲器会被刷新,从而使RXC清零。
置位UCSRB的接收结束中断使能位(RXCIE)后,
只要RXC标志置位(且全局中断使能)就会产生USART
接收结束中断。使用中断方式进行数据接收时,数据接收结束中断服务程序必须从UDR读取数据
以清除RXC标志,否则只要中断处理程序结束,一个新的中断就会产生。
终上所述,RXC标志未清零,导致中断一直产生。
*/
#pragma interrupt_handler USART1Rx:21
void USART1Rx()
{
unsigned char data1;
data1=UDR1;
// USART1_Transmit(data1);
}
关键字:AVR单片机 SPI AT25256
引用地址:
AVR单片机SPI的应用(AT25256)
推荐阅读最新更新时间:2024-03-16 13:06
STM32之SPI的思考
选择了与硬件打交道,就得戒骄戒躁,踏踏实实,一步一步的走下去。可能因为一个非常小的问题,就导致你失败。失败不可怕,可怕的是不能静下心来去思考。我在公司第一次调试硬件,spi的通信,是stm32的硬件既有的通信接口。之前用51的io口模拟过i2c的,感觉spi相对来说更简单些,结果调试spi的读写花费了我3天的时间。stm32f0与网上关于stm32f1大量的例程还不一样,刚刚上市半年多,应该是,并且有几项设置是stm32f1没有的,这也正是关键的地方。你直接把他们的程序拿过来用,可能就卡死了,为什么?因为f0多了个fifo设置,fifo不设置,默认应该是half of 32 bits,当你只接收到8个bit时,rxne不会置位,程
[单片机]
AVR单片机SPI简单应用
主机程序 #include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int /*----------------------------------------- 函数名称: void delay(uchar Da ta) 函数功能: 延时函数 参 数: 返 回 值: 无 -----------------------------------------*/ void delay(uchar Da ta) { uchar i; while(Da ta--) for(i=125;i 0;i--
[单片机]
MSP430G2xx1系列USI的SPI模式详解
简述 在MSP430系列中微控制器中有三种串行通讯模块。它们分别是USART、USI和USCI 。 USART 支持同一硬件模块的两种串行模式,分别是UART和 SPI。USART 实现了独立的收发转换暂存器和 分离的收发缓冲暂存器以及中断能力。 通用同步串行通讯 (USI) ,对于一个 GPIO 数量少的设备来说,是一个高性能串行接口。它是一个 8 或 16bit 移位寄存器,可被用作输出数据,或配合软件一起使用时,可以实现串行通讯。而且 USI 包含了一个能轻松实现 SPI 和 I2C 通讯的硬件功能。 USI 模块还包含了中断功能来减少必要 的对串行通讯管理软件并保持 MSP430 超低功耗的能力。 通用串行接口
[单片机]
MSP430FR2433 用driverlib方式 SPI调试记录
由于MSP430FR2433红板子搞活动,弄了几块玩玩,发现网上很多MSP430系列的SPI很多都使用普通的GPIO模拟SPI,很少有说如何使用driverlib来操作GPIO的,MSP430本身就支持SPI,为何费劲要用GPIO模拟呢? MSP430系列TI提供了driverlib方便用户进行开发,driverlib是对标准的寄存器操作进行了二次封装,用户只需要调用API就可以了,非常方便。 这里有一个迷惑的地方,就是primary function和secondary以及ternary这三个功能对应的芯片GPIO是怎么对应的,刚开始很困惑,其实非常简单,由于MSP430是兼容了UART和SPI,但是同一个引脚同一时刻只有一
[单片机]
STM32模拟4线 SPI驱动OLED(SSD1306)
1.定义引脚对应的IO OLED -- STM32 -- SPI D0 -- PA5 -- SPI_SCK D1 -- PA7 -- SPI_MOSI RES -- PB0 -- RES#(OLED的RESET脚,低电平有效) DC -- PB1 -- DC#(OLED的DC脚,数据和命令控制管脚) CS -- PA4 -- SPI_CS 2.SSD1306使用4Wire SPI写操作的时序图 CS#--片选--拉低CS#选中SSD1306 D/C#-- 高电平为写数据,低电平为写命令 在SCLK(D0)为低电平时,SS
[单片机]
SPI nRF24L01无线 [可以放在2个单片机里实现通信]
main.c 1 #include reg51.h 2 #include 2401.h 3 4 #define uint unsigned int 5 #define uchar unsigned char 6 7 sbit KEY8=P3^7; //发送按键 8 sbit beep=P2^3;//喇叭 9 sbit LED6=P1^6; ////接收到数据后的功能实现灯 10 11 void delay_ms(uint z) //延时函数 12 { 13 uint x,y; 14 for(x=z;x 0;x--) 15 for(y=110;y 0;y--); 16 } 17
[单片机]
AVR单片机教程——数码管
先解答之前一个思考题:如果不把引脚配置为输出而写高电平,连接LED会怎样? 实验结果是,LED会亮,但相比于输出高电平的情况,亮度很低。这是为什么呢? 通过上一篇教程我们知道,引脚输入输出模式是由寄存器DDRx中DDxn位控制的,可以推断出 pin_mode 函数会改变一个引脚对应的DDxn值,输入为0,输出为1,而其复位后的值为0,即输入,因此如果不把引脚配置为输出,它的模式就是输入。类似地 pin_write 函数会改变PORTxn,其值为函数的第二个参数。 所以不配置输出而写高电平的结果就是,这一引脚的DDxn为0,PORTxn为1,是带上拉电阻的输入模式。上拉电阻相当于VCC接电阻后再接在引脚上,外部电路是引脚
[单片机]
SPI-4接口的时钟方案
面对当今复杂的FPGA设计,时钟是至关重要的,工程的成败往往取决于它。而对于SPI-0接口设计来说,由于输入时钟高于311 MHz,并且是双沿采样的,所以时钟设计显得更加重要。对于Xilinx Virtex-5器件来说,内部提供了全局时钟和区域时钟两大时钟网络,我们分别利用这两大资源来设计SPI-4的时钟方案。全局时钟如图1所示,区域时钟如图2所示。其中,RDCLK是Sink Core的输入时钟,Sysclk为Source Core的参考时钟,TSCLK为Source Core的状态信息通道的输入时钟,用户可以根据实际情况来选择。
图1 全局时钟
图2 区域时钟
此外,TDCLK由SysCl
[嵌入式]