//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 <iom168v.h>
#include <macros.h>
#include <LED_Interphone.h>
#include <TransToSlave.h>
uchar uSenddata[]={0x53,81,85,82,0x45};
int iNum_send;
uchar uRec_back_flag=0;
/*******************************************
函数名称:master_port_init(void)
功 能:端口初始化函数
参 数: 无
返回值 : 无
/********************************************/
void master_port_init(void)
{
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0xFF;
//PORTD = 0x00;
DDRD = 0xFF;
}
//SPI initialize
// clock rate: 57599hz
/*******************************************
函数名称:void master_spi_init(void)
功 能:SPI 设置初始化
参 数: 无
返回值 : 无
/********************************************/
void master_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
PORTB |= (1<<PB2) | (1<<PB3) | (1<<PB4) | (1<<PB5);
DDRB |= (1<<DDB3) | (1<<DDB5) | (1<<DDB2); //Set MOSI, SCK AND SS as outputs
SPCR = 0x73; //setup SPI
SPSR = 0x00; //setup SPI
}
/*******************************************
函数名称:master_init_devices(void)
功 能:初始化设备
参 数: 无
返回值 : 无
/********************************************/
void master_init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
master_port_init();
master_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)
功 能:SPI 主机发送 函数
参 数: 无
返回值 : 无
/********************************************/
void SPI_MasterTransmit(char cData)
{
//PORTB &=~ (1<<PB4); //强制接收方进入从模式
PORTB &=~ (1<<PB2); //强制接收方进入从模式
SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式
/* 启动数据传输 */
SPDR = cData;
/* 等待传输结束 */
while(!(SPSR & (1<<SPIF)))
;
//PORTB |= (1<<PB4);
PORTB |= (1<<PB2); ///讲SS拉高时,表示数据传输停止
}
/*******************************************
函数名称:void SPI_MasterTransmit(char cData)
功 能:SPI 主机 写数据 函数
参 数: 无
返回值 : 无
/********************************************/
void SPI_HostWriteByte(unsigned char Data)
{
// 启动数据传输
SPDR = Data;
// 等待传输结束
while(!(SPSR & (1<<SPIF)))
;
}
#pragma interrupt_handler spi_stc_isr:iv_SPI_STC
void spi_stc_isr(void)
{uchar Rec_tempdata;
//byte in SPDR has been sent/received
//SPCR &=~(1<SPIE);
Rec_tempdata = SPDR;
if(Rec_tempdata=0xaa)
{uRec_back_flag=1;
PORTD=Rec_tempdata;
Delayms(20);
PORTD=0x00;
} //标志位 --表示接受到了确认信息
//master_init_devices();
}
uchar SPI_MasterReadByte(void)
{
SPDR = 0;
// 等待传输结束
while(!(SPSR & (1<<SPIF)))
;
return SPDR;
}
void Send_reg_data(uchar reg[],int num)
{int i;
for(i=0;i<num;i++)
{
SPI_MasterTransmit(uSenddata[i]);
//SPI_HostWriteByte(uSenddata[i]);
Delayms(10);
}
}
void main(void)
{
uchar i=0;
uchar recdata=0;
master_init_devices();
//InitDevicesToSlave();
while(1)
{
Send_reg_data(uSenddata,5); //发送数据包
Delayus(100);
InitDevicesToSlave();
Delayms(100);
if(uRec_back_flag==1)
{PORTC|=0x03;
Delayms(50);
PORTC&=0x00;
uRec_back_flag=0;
}
master_init_devices();
//InitDevicesToSlave();
//uchar uRec_back_flag=0;
Delayms(200); //延时足够时间,让下位机有足够时间处理数据
// if(uRec_back_flag==0) {Send_reg_data(uSenddata,5);}
// else master_init_devices();
}
}
ATmega168 -48 SPI双机互通信
需积分: 10 52 浏览量
2009-09-24
11:06:38
上传
评论
收藏 88KB RAR 举报
beancurd_725
- 粉丝: 0
- 资源: 7
最新资源
- 基于matlab实现电力系统仿真计算软件包,包括潮流计算,最优潮流计算等.rar
- 基于matlab实现电力系统各种故障波形仿真,单相接地故障,两相间短路,两相接地短路,三相短路等.rar
- 基于matlab实现电动汽车动力性,爬坡性,续驶里程等性能仿真.rar
- Python动态烟花代码.pdf
- 基于matlab实现串口发送接收数据 可配置端口,波特率等 发送可选择ASCII方式或HEX方式
- matlab基于BP神经网络手写字母识别(单一).zip代码9
- 基于matlab实现编写的串口调试工具,数据接收部分采用中断方式,保证了实时的数据显示
- 基于matlab实现39节点电力系统合闸角调控过程中的机组和负荷的灵敏度计算.rar
- HBase数据库性能调优
- 原生微信小程序源码 - -首字母排序选择
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈