首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

AVR单片机读写CPLD

AVR单片机读写CPLD

项目中需要使用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"

  • #defineSetBit(Port,N)(Port|=(1<<n)) p="" 设置io某一位
  • #defineClrBit(Port,N)(Port&=~(1<<n)) p="" 清空io某一位
  • #defineReverBit(Port,N)(Port^=(1<<n)) p="" 取反io某一位
  • #defineGetBit(Pin,N)((Pin>>N)&0x01)//读取IO某一位

  • unsignedchardata;
  • voidXRAM_example(void)
  • {
  • unsignedchar*q=0x1100;//寄存器1
  • unsignedchar*m=0x1101;//寄存器2
  • unsignedchar*p=0x1102;//寄存器3
  • PORTD=0XFF;
  • DDRD=0XFF;
  • DDRC=0xFF;//默认情况下端口C用做高地址,可以每只寄存器把端口C释放
  • PORTC=0x00;
  • *q=0xCC;//向寄存器1中写入数据,CPLD中自动将寄存器1的值付给寄存器3
  • data=*p;//独处寄存器3中的值,在循环中用串口输出
  • }
  • voidUSART0_Init(void)
  • {
  • UCSR0A=0x20;//波特率不加倍,单机通信模式
  • UCSR0B=0x18;//中断不使能,允许发送和接收
  • UCSR0C=0x06;//异步模式,无校验,8位数据,1位停止位
  • UBRR0H=0x00;
  • UBRR0L=51;//9600波特率晶振8M
  • }
  • voidUSART0_SendByte(unsignedchardata)
  • {
  • while(!(UCSR0A&(1<<udre0))); p="" 等待发送缓冲空
  • UDR0=data;//发送数据
  • }
  • intmain(void)
  • {
  • unsignedchari=0;
  • USART0_Init();//初始化USART0接口
  • MCUCR=0xC0;//使能外部SRAM
  • XMCRA=0x00;
  • DDRA=0XFF;
  • PORTA=0XFF;
  • DDRE=0xff;
  • DDRD=0xff;
  • PORTD=0x00;//使能CSA16A17=11
  • USART0_SendByte(0x88);

  • while(1)
  • {
  • ReverBit(PORTA,0);
  • XRAM_example();
  • _delay_ms(500);
  • USART0_SendByte(data);
  • }
  • }
返回列表