AVR单片机读写CPLD程序实例(ATmega128程序案例)

描述

项目中需要使用CPLD完成一部分算法设计,参数由AVR给出,因此需要完成AVR和CPLD的通信。因此写了一个测试程序。CPLD挂在AVR的数据和地址总线上,AVR使用ATmega128,在CPLD中设置几个寄存器,通过AVR读写寄存器来实现两者之间的通信。

Mega128的外部存储空间从0X1100开始,因此只需要配置相应的寄存器后读取或者写入相应的地址就可以,程序比较简单,注释中都有说明,仅供参考。

/******************************************************************* 

名称:mian.c 

功能:测试AVR与CPLD的通信,将数据写入CPLD中配置的寄存器,然后读出, 

通过串口输出做比较 

作者:emouse 

时间:2011.1.4 

版本:1.0 

注意:无 

********************************************************************/#include"avr/io.h"   

#include"avr/interrupt.h"   

#include"util/delay.h"  

#define SetBit(Port,N)  (Port|=(1<

#define ClrBit(Port,N)  (Port&=~(1<

#define ReverBit(Port,N)  (Port^=(1<

#define GetBit(Pin,N)   ((Pin>>N)&0x01)   //读取IO某一位   

unsigned char data;  

void XRAM_example(void)  

{  

unsigned char *q =0x1100;   //寄存器1  

unsigned char *m =0x1101;   //寄存器2  

unsigned char *p =0x1102;   //寄存器3  

PORTD=0XFF;                

DDRD=0XFF;  

DDRC = 0xFF;                //默认情况下端口C用做高地址,可以每只寄存器把端口C释放  

PORTC = 0x00;  

*q= 0xCC;                   //向寄存器1中写入数据,CPLD中自动将寄存器1的值付给寄存器3  

data=*p;                    //独处寄存器3中的值,在循环中用串口输出  

}  

void USART0_Init(void)   

{   

UCSR0A=0x20; //波特率不加倍,单机通信模式   

UCSR0B=0x18; //中断不使能,允许发送和接收   

UCSR0C=0x06;//异步模式,无校验,8位数据,1位停止位   

UBRR0H=0x00;   

UBRR0L=51;//9600波特率   晶振8M  

}   

void USART0_SendByte(unsigned char data)   

{   

while(!(UCSR0A&(1<

UDR0=data;    //发送数据   

}    

int main(void)   

{      

unsigned char i=0;   

USART0_Init();  //初始化USART0接口     

MCUCR=0xC0;     //使能外部SRAM   

XMCRA=0x00;  

DDRA=0XFF;  

PORTA=0XFF;   

DDRE=0xff;   

DDRD=0xff;   

PORTD=0x00;      //使能 CS A16 A17 =11   

USART0_SendByte(0x88);  

while(1)   

{        

ReverBit(PORTA,0);  

XRAM_example();  

_delay_ms(500);  

USART0_SendByte(data);   

}   

}   

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分