您的位置 首页 培训

AVR单片机SPI通讯实例程序

本人的一个SPI的实例,通过SPI实现两机通讯, 采用中断方式实现双全工通讯。

自己的一个SPI的实例,经过SPI完结两机通讯, 选用中止方法完结双全工通讯。
本例用两MEGA8515完结,衔接为:
MISO—-MISO
MOSI—-MOSI
SCK —-SCK
/SS —-/SS
即将发送的数据加载到发送缓冲区的函数fill_tx_buffer和从接纳缓冲区读出数据的函数read_rx_buffer未给出,依据各自需求请自己完结。

#define SPI_RX_BUFFER_SIZE 10
#define SPI_RX_BUFFER_MASK ( SPI_RX_BUFFER_SIZE – 1 )
#define SPI_TX_BUFFER_SIZE 10
#define SPI_TX_BUFFER_MASK ( SPI_TX_BUFFER_SIZE – 1 )
#define SET_SPI_MODE PORTB.4
#define SPI_MODE PINB.4

static unsigned char SPI_RxBuf[SPI_RX_BUFFER_SIZE];
static volatile unsigned char SPI_RxHead;
static unsigned char SPI_TxBuf[SPI_TX_BUFFER_SIZE];
static volatile unsigned char SPI_TxHead;
//******************************************
// SPI 中止服务程序
//******************************************
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
if(spi_m==0) //假如spi_m为0,标明是接纳状况
{
data = SPDR; //读入接受到的数据
SPI_RxBuf[SPI_RxHead-1] = data; //将接纳到的数据存入接纳缓存区
if ( SPI_RxHead == SPI_RX_BUFFER_MASK ) //假如是接纳帧的最终一个数据
{
SPI_RxHead = 0; //已接纳数据复原
MSTR=1; //接纳完结,将SPI设回主方法
spi_trans_com=1; //置接纳完结标志
}
else
{
SPI_RxHead++; //已接纳数据计数器加1
}

}
else //假如spi_m为1,标明是发送状况
{

if ( SPI_TxHead = SPI_TX_BUFFER_MASK) //假如要发送的数据还未悉数发完
{
SPDR = SPI_TxBuf[SPI_TxHead]; //从发送缓存区取数发送
SPI_TxHead++; //已发送数据计数器加1
}
else //假如要发送的数据已悉数发完
{
SPI_TxHead=0; //已发送数据计数器复原
DDRB.4=0;
SET_SPI_MODE=1; //开释总线,以便接纳方进入主发送。
spi_m=0;
spi_sending=0; //清空发送中符号
}

}

}

//******************************************
// SPI 初始化
//******************************************
void InitSPI(void)
{

SPCR=0x52;
SPI_RxHead = 0;
SPI_TxHead = 0;

}

//******************************************
//发送数据
//******************************************
void spi_send(void)
{
if(spi_sending==0) //发送中符号为0,标明spi发送闲暇
{

fill_tx_buffer(); //调用fill_tx_buffer函数,即将发送的数据加载到发送缓冲区
while(PINB.4==0) //假如PINB.4为低,标明总线被接受方占用,等候直至接受方发送完结。
{;}

InitSPI(); //初始化spi为主方法
DDRB.4=1;
SET_SPI_MODE=0; //将PORTB.4拉低,逼迫接纳方进入从接纳方法
spi_m=1; //置spi_m标志标明为发送状况
delay_us(10);
spi_sending=1; //置spi_sending标志标明发送进行中
SPDR=0xFF; //开端发送,接纳方接纳到的第一个数据为0xFF应疏忽
SPIE=1; //开SPI中止,
SPI_TxHead = 0; //已发送数据计数器清0
}
}

void main(void)
{


while(1)
{

if(spi_trans_com==1) //假如接纳完结标志为1,标明有所数据已接纳
{
read_rx_buffer(); //调用read_rx_buffer函数,将接纳到的数据从接纳缓冲区读出
spi_trans_com=0; //读完铲除接纳完结标志
}

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/198981.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部