⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pro3.c

📁 介绍了如何用vhdl语言实现处理器的spi接口
💻 C
字号:

#define SIZE 100 
unsigned char SPI_rx_buff[SIZE]; 
unsigned char SPI_tx_buff[SIZE]; 
unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow; 
unsigned char tx_wr_index,tx_rd_index,tx_counter; 

#pragma interrupt_handler spi_stc_isr:18 
void spi_stc_isr(void) 
{ 
  SPI_rx_buff[rx_wr_index] = SPDR; //从ISP口读出收到的字节 
  if (++rx_wr_index == SIZE) rx_wr_index = 0; //放入接收缓冲区,并调整队列指针 
  if (++rx_counter == SIZE) 
    { 
      rx_counter = 0; 
      rx_buffer_overflow = 1; 
    } 
  if (tx_counter) //如果发送缓冲区中有待发的数据 
    { 
      --tx_counter; 
      SPDR = SPI_tx_buff[tx_rd_index]; //发送一个字节数据,并调整指针 
      if (++tx_rd_index == SIZE) tx_rd_index = 0; 
    } 
} 

unsigned char getSPIchar(void) 
{ 
  unsigned char data; 
  while (rx_counter == 0); //无接收数据,等待 
  data = SPI_rx_buff[rx_rd_index]; //从接收缓冲区取出一个SPI收到的数据 
  if (++rx_rd_index == SIZE) rx_rd_index = 0; //调整指针 
  CLI(); 
  --rx_counter; 
    SEI(); 
    return data; 
} 

void putSPIchar(char c) 
{ 
  while (tx_counter == SIZE);//发送缓冲区满,等待 
  CLI(); 
  if (tx_counter || ((SPSR & 0x80) == 0))//发送缓冲区已中有待发数据 
    { //或SPI正在发送数据时 
      SPI_tx_buffer[tx_wr_index] = c; //将数据放入发送缓冲区排队 
      if (++tx_wr_index == SIZE) tx_wr_index = 0; //调整指针 
      ++tx_counter; 
    } 
  else 
    SPDR = c; //发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送 
SEI(); 
} 

void spi_init(void) 
{ 
  unsigned chat temp; 
  DDRB |= 0x080; //MISO=input and MOSI,SCK,SS = output 
  PORTB |= 0x80; //MISO上拉电阻有效 
  SPCR = 0xD5; //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率 
  SPSR = 0x00; 
  temp = SPSR; 
  temp = SPDR; //清空SPI,和中断标志,使SPI空闲 
} 

void main(void) 
{ 
  unsigned char I; 
  CLI(); //关中断 
  spi_init(); //初始化SPI接口 
  SEI(); //开中断 
  while() 
    { 
      putSPIchat(i); //发送一个字节 
      i++; 
      getSPIchar(); //接收一个字节(第一个字节为空字节) 
      ……… 
    } 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -