小组 > 单片机 > EDN商城51单片机开发板 > 调试通过的AVR mega16 SPI双机通讯例子
?
?
小组信息
名称:EDN商城51单片机开发板

管理员:

人数:66
小组积分:730
简介:单片机读写U盘方案-SL811HST开发套件(增强版)361.00元ELITE-III单片机学习开发系统283.10元51单片机开发板(1602液晶+温度+通信+储存+下载线+变压器)144.00元增强型51实验板140.60元aclass="blue"href="http:

小组公告

小组暂无公告.

返回本小组首页

楼主??[其他]?

调试通过的AVR mega16 SPI双机通讯例子


作者:huangna
积分:32734分
总积分:60085分
:28461
发送信息
加为好友
发表于2008-11-03 15:48
调试通过的AVR mega16 SPI双机通讯例子 (为新手设计,简单易懂)

本程序实现的功能:主机发送1~255,丛机接收并在LED上显示出来。

连接方式: 两个mega16最小系统板 PB4到PB7全部对连。

本程序在本站的最小系统板上测试通过,我向你担保本程序的正确性。
主机程序:

CODE:


//ICC-AVR application builder : 2007-7-18 13:01:11
// Target : M16
// Crystal: 7.3728Mhz
// 作者:古欣
// AVR与虚拟仪器 http://www.avrvi.com
// 功能: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();
}
}
}

[Copy to clipboard]


huangna 编辑于2009-08-29 09:58
分享到:? 新浪微博?? qq空间??
投票数: ? 回复?? ? 引用??
1楼??[其他]?

Re:调试通过的AVR mega16 SPI双机通讯例子


作者:huangna
积分:32734分
总积分:60085分
:28461
发送信息
加为好友
发表于2008-11-03 15:51
从机程序


CODE:


//ICC-AVR application builder : 2007-7-18 12:56:10
// Target : M16
// Crystal: 7.3728Mhz
// 作者:古欣
// AVR与虚拟仪器 http://www.avrvi.com
// 功能:从机模式,中断方式接收,并在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)
;//等待中断
}

? 回复?? ? 引用??
2楼??[其他]?

Re:调试通过的AVR mega16 SPI双机通讯例子


作者:penglijiang
积分:261分
总积分:524分
:251
发送信息
加为好友
发表于2009-01-05 16:47
谢谢分享

? 回复?? ? 引用??
3楼??[其他]?

Re:调试通过的AVR mega16 SPI双机通讯例子


作者:sd7087003
积分:68分
总积分:136分
:68
发送信息
加为好友
发表于2009-07-20 13:57
信息网我序言哦组程序

? 回复?? ? 引用??
4楼??[其他]?

Re:调试通过的AVR mega16 SPI双机通讯例子


作者:neuqyl
积分:125分
总积分:250分
:125
发送信息
加为好友
发表于2009-08-29 09:58

恩? 还不错的


? 回复?? ? 引用??
5楼??[其他]?

Re:调试通过的AVR mega16 SPI双机通讯例子


作者:kamfun
积分:100分
总积分:187分
:100
发送信息
加为好友
发表于2014-03-14 17:43
楼主,为什么我的看不到呢?很想学习啊

? 回复?? ? 引用??
点击登录,立即回复。
EDNC 官方微信公众平台

EDN China官方微信


扫一扫关注,获取
电子新知,设计灵感

精彩推荐
IC厂商小组 在线研讨会 赞助商链接
小组活跃用户
明日之星