项目中需求运用CPLD完结一部分算法规划,参数由AVR给出,因而需求完结AVR和CPLD的通讯。因而写了一个测验程序。CPLD挂在AVR的数据和地址总线上,AVR运用ATmega128,在CPLD中设置几个寄存器,经过AVR读写寄存器来完成两者之间的通讯。
Mega128的外部存储空间从0X1100开端,因而只需求装备相应的寄存器后读取或许写入相应的地址就能够,程序比较简单,注释中都有阐明,仅供参考。
功用:测验AVR与CPLD的通讯,将数据写入CPLD中装备的寄存器,然后读出,经过串口输出做比较。
/#include“avr/io.h”
#include“avr/interrupt.h”
#include“uTIl/delay.h”
#defineSetBit(Port,N)(Port|=(1《
#defineClrBit(Port,N)(Port&=~(1《
#defineReverBit(Port,N)(Port^=(1《
#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《
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);
}
}