最新动态

工业物联网通讯专家!
认真做好每一件事,设计简单、可靠、价格合理的产品!

AVR mega16 SPI双机通讯例子程序代码

调试通过的AVR mega16 SPI双机通讯例子 (为新手设计,简单易懂)本程序实现的功能:主机发送1~255,丛机接收并在LED上显示出来。连接方式: 两个mega16最小系统板 PB4到PB7全部对连。
本程序在本站的最小系统板上测试通过,我向你担保本程序的正确性。

查看商品:ATmega16 开发板 AVR学习板 Mega16 核心板 (特价)

ATmega16 开发板 AVR学习板 Mega16 核心板 (特价)AVR-Mini-DC-Mega16 核心板

//ICC-AVR application builder : 2007-7-18 13:01:11 // Target : M16 // Crystal: 7.3728Mhz // 作者:古欣 // AVR与虚拟仪器 [url]http://www.avrvi.com[/url] // 功能:SPI主机模式,循环发送从1~255 #include <iom16v.h> #include <macros.h> void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //SPI initialize // clock rate: 57599hz void spi_init(void) { PORTB |= (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7); DDRB |= (1<<DDB5) | (1<<DDB7) | (1<<DDB4);     //Set MOSI, SCK AND SS as outputs SPCR = 0x73; //setup SPI SPSR = 0x00; //setup SPI } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); spi_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void SPI_MasterTransmit(char cData) { PORTB &=~ (1<<PB4); //强制接收方进入从模式 SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式 /* 启动数据传输 */ SPDR = cData; /* 等待传输结束 */ while(!(SPSR & (1<<SPIF))) ; PORTB |= (1<<PB4); } void Delay(void) //延时,没有详细计算 { unsigned int i,j; for(i=1000;i>0;i--) { for(j=200;j>0;j--) ; } } void main(void) { unsigned char i=0; init_devices(); while(1) { for(i=255;i>0;i--) { SPI_MasterTransmit(i); Delay(); } } }

//ICC-AVR application builder : 2007-7-18 12:56:10 // Target : M16 // Crystal: 7.3728Mhz // 作者:古欣 // AVR与虚拟仪器 [url]http://www.avrvi.com[/url] // 功能:从机模式,中断方式接收,并在LED上显示 #include <iom16v.h> #include <macros.h> void port_init(void) { PORTA = 0x00; DDRA = 0xFF; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //SPI initialize // clock rate: 57599hz void spi_init(void) { SPCR = 0xE3; //setup SPI SPSR = 0x00; //setup SPI } #pragma interrupt_handler spi_stc_isr:11 void spi_stc_isr(void) { //byte in SPDR has been sent/received PORTA = SPDR; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); spi_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void main(void) { init_devices(); DDRB|=(1<<PB6); //MOSI 设置为输出 while(1) ;//等待中断 }



上一篇: 德州仪器(TI) $65亿现金收购美国国家半导体公司(NS)
下一篇: GPRS DTU是什么?其工作原理是什么?

发表评论