打印
[AVR单片机]

双机SPI全双工通讯例程

[复制链接]
2894|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lovelyegle|  楼主 | 2010-1-4 23:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/******************************************
Mega64(L)
******************************************/
#ifndef __SPI__H
#define __SPI__H

#define SS   PB0   //pin 10
#define SCK   PB1   //pin 11
#define MOSI PB2   //pin 12
#define MISO PB3   //pin 13
#define SPI_RX_SIZE   7
#define SPI_TX_SIZE   5
#define SS_L() PORTB &=~ (1<<SS);
#define SS_H() PORTB |= (1<<SS);
#define SPI_RX 0
#define SPI_TX 1
unsigned char spi_rx_buffer[SPI_RX_SIZE];       //SPI recv buffer
unsigned char spi_rx_head;               //SPI recv handle
unsigned char spi_rx_flag;               //rx busy
unsigned char spi_tx_buffer[SPI_TX_SIZE];     //SPI command buffer
unsigned char spi_tx_head;               //spi send handle
unsigned char spi_tx_flag;               //tx busy
unsigned char spi_mode;                 //spi mode
unsigned char spi_command_flag;             //1:接收到完整数据帧
/******************************************
        init
******************************************/
void spi_rx_init( void )
{
  unsigned char temp;
  
  temp = SPSR;
  temp = SPCR;
  
  DDRB &= ~((1<<MOSI)|(1<<SCK)|(1<<SS));
  SS_H();
  PORTB |= (1<<MOSI)|(1<<SCK);
  PORTB |= 1<<MISO;                     
  SPCR = 0xE3;                       //setup SPI
  SPSR = 0x00;                       //setup SPI
  spi_rx_head = 0;
  spi_rx_flag = 0;
  spi_mode = SPI_RX;
  spi_command_flag = 0;
}
void spi_tx_init( void )
{
  unsigned char temp;
  
  DDRB &= ~(1<<MISO);
  DDRB |= (1<<SS) | (1<<SCK) | (1<<MOSI);   //Set MOSI, SCK AND SS as outputs
  SS_H();
  PORTB |= 1<<MISO;
  
  SPCR = 0x00;
  SPCR = 0xF3;
  temp = SPSR;                         //prepare for sending
  temp = SPCR;
  spi_mode = SPI_TX;
  spi_tx_head = 0;
  spi_command_flag = 0;
}
/**************************************
0x7F type xx xx xx xx 0x0D
type : 0x01 : AD转换结果
    0x02 : 其他类型数据
//byte in SPDR has been sent/received
**************************************/
#pragma interrupt_handler spi_stc_isr:18
void spi_stc_isr(void)
{
unsigned char temp;

temp = SPDR;
//Uart0_Transmit(temp);
if (spi_mode == SPI_TX)             //发送模式
{
  SS_H();
   spi_tx_head ++;
   if (spi_tx_head < SPI_TX_SIZE)       //发送缓冲区不为空
   {
    delay_us(20);
    SS_L();
    SPDR = spi_tx_buffer[spi_tx_head];   //发送下一个字节
   }
   if (spi_tx_head == SPI_TX_SIZE)       //发送缓冲区为空
   {
    spi_tx_head = 0;
    spi_rx_init();                 //重新初始化成接收模式
    spi_tx_flag = 0;
   }
}

相关帖子

沙发
lovelyegle|  楼主 | 2010-1-4 23:29 | 只看该作者
if (spi_mode == SPI_RX)               //接收模式
{
   if (temp == 0xFF) return;             //这个问题是怎么回事情呢?
  spi_rx_flag = 1;
   if (spi_rx_head < SPI_RX_SIZE)         //接收缓冲区不满
   {
    spi_rx_buffer[spi_rx_head] = temp;     //读取一个字节
    spi_rx_head ++;
   }
   if (spi_rx_head == SPI_RX_SIZE)         //接收缓冲区已满
   {
    spi_rx_head = 0;
    spi_rx_flag = 0;
    spi_command_flag = 1;
   }
}
}
void spi_send( void )
{
  unsigned char i,temp;
  
  while(spi_rx_flag) {;}
  while(spi_tx_flag) {;}
  spi_tx_init();
  spi_tx_flag = 1;
  
  SS_H();   
  SS_L();
  SPDR = spi_tx_buffer[0];
}
#endif

使用特权

评论回复
板凳
love_life| | 2010-1-6 22:59 | 只看该作者
LZ存储的资源很丰富啊,谢谢LZ了:)

使用特权

评论回复
地板
wangwo| | 2010-1-9 00:03 | 只看该作者
牛---是双机SPI的

使用特权

评论回复
5
Karlshen| | 2010-1-11 23:14 | 只看该作者
慢慢研究去

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

640

帖子

1

粉丝