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" #define SetBit(Port,N) (Port|=(1<<N)) //设置IO某一位 #define ClrBit(Port,N) (Port&=~(1<<N)) //清空IO某一位 #define ReverBit(Port,N) (Port^=(1<<N)) //取反IO某一位 #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<<UDRE0))); //等待发送缓冲空 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); } }  

你可能感兴趣的:(c,算法,IO,测试,存储,delay)