当前位置:首页 > 单片机 > 单片机
[导读]十、ATMEGA16的同步串行接口SPI十—(03)、ATMEGA16的同步串行接口SPI的串行通讯实验—通过效率最高的中断法~~然后就是程序了~~IAR10_2_M.c//-------------------------------------------------------------------

十、ATMEGA16的同步串行接口SPI

十—(03)、ATMEGA16的同步串行接口SPI的串行通讯实验—通过效率最高的中断法~~





然后就是程序了~~

IAR10_2_M.c

//------------------------------------------------------------------------------
//这是ATMEGA16作为主机发送的文件
//主机每隔1s发送数组的一个数据给从机,从机收到后则发送自己的数组的一个数据给主机,这样实现数组内容的交换
//数组的内容在主机和从机的数码管上显示
#include"ioavr.h"
#include"intrinsics.h"
#include"delayics.h"
#include"bitics.h"
#include"macroandconst.h"
//------------------------------------------------------------------------------
#define SPIF 7
#define SS4
uchar __flash seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管
uchar __flash act[4]={0xfe,0xfd,0xfb,0xf7};//位选
uchar tx_buffer[10]={0,1,2,3,4,5,6,7,8,9};
uchar rx_buffer[10];
uchar i=0;
uchar master_flag=0;
//------------------------------------------------------------------------------
//端口初始化函数
void port_init()
{
DDRA=0XFF;
PORTA=0X00;

DDRB=0XB0;//SCK、MOSI、SS置位为输出,MISO设置为输入
PORTB=0X10;//SS输出高电平,其余都输入/输出低电平(SS输出高电平,不进行发送,要想发送要将SS拉低,激活从机SPI接口~~)

DDRC=0XFF;
PORTC=0XFF;
}
//------------------------------------------------------------------------------
//SPI初始化函数
void spi_init()
{
SPCR=0xd1;//SPI中断使能;SPI使能;数据的MSB先发送;选择为主机模式;
//时钟极性:上升沿为起始沿,结束眼为下降沿;时钟相位:起始沿采样;16分频
}
//------------------------------------------------------------------------------
//芯片初始化函数
void device_init()
{
__disable_interrupt();
port_init();
spi_init();
__enable_interrupt();
}
//------------------------------------------------------------------------------
//main
void main()
{
uchar count;
device_init();
for(count=0;count<10;count++)
{
PORTA=seg[tx_buffer[count]];
PORTC=act[0];
delay_s(1);
}
CLR_BIT(PORTB,SS);//清除SS,准备发送
SPDR=tx_buffer[0];//给主机的发送缓冲区送一个数
while(1)
{
if(master_flag==1)
{
for(count=0;count<10;count++)
{
PORTA=seg[rx_buffer[count]];
PORTC=act[0];
delay_s(1);
}
}
}
}
//------------------------------------------------------------------------------
//SPI_STC
#pragma vector=SPI_STC_vect
__interrupt void spi_stc()
{
rx_buffer[i]=SPDR;
if(i>=9)
{
SET_BIT(PORTB,SS);//结束发送
master_flag=1;//置位标志位
goto end;//这个语句必须要有~~!!!!!
}
i++;
SPDR=tx_buffer[i];
end://发送结束,不再进行中断~~
;
}

IAR10_2_S.c

//------------------------------------------------------------------------------
//这是ATMEGA16作为从机接收的文件
//主机每隔1s发送数组的一个数据给从机,从机收到后则发送自己的数组的一个数据给主机,这样实现数组内容的交换
//数组的内容在主机和从机的数码管上显示
#include"ioavr.h"
#include"intrinsics.h"
#include"delayics.h"
#include"bitics.h"
#include"macroandconst.h"
//------------------------------------------------------------------------------
#define SPIF 7
#define SS4
uchar __flash seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管
uchar __flash act[4]={0xfe,0xfd,0xfb,0xf7};//位选
uchar tx_buffer[10]={9,8,7,6,5,4,3,2,1,0};
uchar rx_buffer[10];
uchar i=0;
uchar slave_flag=0;
//------------------------------------------------------------------------------
//端口初始化函数
void port_init()
{
DDRA=0XFF;
PORTA=0X00;

DDRB=0X40;//SCK、MOSI、SS置位为输入,MISO设置为输出
PORTB=0X10;//SS输入高电平,其余都输入/输出低电平(SS输入高电平,不进行接收,要想发送要将SS拉低,激活从机SPI接口~~)

DDRC=0XFF;
PORTC=0XFF;
}
//------------------------------------------------------------------------------
//SPI初始化函数
void spi_init()
{
SPCR=0xc1;//SPI中断使能;SPI使能;数据的MSB先发送;选择为从机模式;
//时钟极性:上升沿为起始沿,结束眼为下降沿;时钟相位:起始沿采样;16分频
}
//------------------------------------------------------------------------------
//芯片初始化函数
void device_init()
{
__disable_interrupt();
port_init();
spi_init();
__enable_interrupt();
}
//------------------------------------------------------------------------------
//main
void main()
{
uchar count;
device_init();
for(count=0;count<10;count++)
{
PORTA=seg[tx_buffer[count]];
PORTC=act[0];
delay_s(1);
}
SPDR=tx_buffer[0];//给从机的发送缓冲区送一个数,等待移出
while(1)
{
if(slave_flag==1)
{
for(count=0;count<10;count++)
{
PORTA=seg[rx_buffer[count]];
PORTC=act[0];
delay_s(1);
}
}
}
}
//------------------------------------------------------------------------------
//SPI_STC
#pragma vector=SPI_STC_vect
__interrupt void spi_stc()
{
rx_buffer[i]=SPDR;
if(i>=9)
{
SET_BIT(PORTB,SS);//结束发送
slave_flag=1;//置位标志位
goto end;//这个语句必须要有的~~!!!!!!
}
i++;
SPDR=tx_buffer[i];
end://到达end结束发送,不再进行发送~~
;
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。SPI是一种单主机、高速的,全双工,同步...

关键字: spi spi通信原理

为什么要加锁在SMP系统中,如果仅仅是需要串行地增加一个变量的值,那么使用原子操作的函数(API)就可以了。但现实中更多的场景并不会那么简单,比如需要将一个结构体A中的数据提取出来,然后格式化、解析,再添加到另一个结构体...

关键字: spi ic ck

为什么要加锁在SMP系统中,如果仅仅是需要串行地增加一个变量的值,那么使用原子操作的函数(API)就可以了。但现实中更多的场景并不会那么简单,比如需要将一个结构体A中的数据提取出来,然后格式化、解析,再添加到另一个结构体...

关键字: spi ic ck

SPI接口通信原理

关键字: spi 通讯

引言   现场总线作为生产过程自动化发展的重点,对推动自动化技术起到巨大的推动作用,是现代化工业的标志。MODBUS作为现场总线的一种通信协议,它实现了PLC控制器、工控仪表与设备间的通

关键字: avr单片机 智能控制系统 modbus协议

Linux 点击上方蓝字 记得关注我们哦! 内核里已经提供spi接口小屏的设备驱动,在内核的配置选项: make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf...

关键字: spi 内核

  SPI即串行外围设备接口,是一种高速的,全双工,同步的通信总线,由于其在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,出于这种简单易用的特性,很多AD转

关键字: spi 隔离芯片

你知道首款2Gb大容量高性能SPI NOR Flash产品吗?业界领先的半导体器件供应商兆易创新GigaDevice(股票代码 603986)今日宣布,隆重推出国内首款容量高达2Gb、高性能SPI NOR Flash——...

关键字: 2gb nor spi 兆易创新 flash产品

摘 要: Xilinx 7系列FPGA是Xilinx公司最新推出的一个芯片系列,Kintex7是该系列芯片中的一种,拥有大量的可编程资源。即便如此,在一些多模式的大型复杂的系统设计中,芯片的资源

关键字: Flash FPGA spi
关闭
关闭