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

📄 ad7791.txt

📁 这是ad7791的驱动程序,AD7791是24位的高精度AD
💻 TXT
字号:
我要写一个程序,是通过SPI口读取AD7791的转换结果,但是我读出来的结果一直都不对,不知程序错在那里了,请各位高手帮忙 
急等着用,希望各位帮忙找错,在此先谢过了 

/*SPI初始化*/ 
void spi_init(void)   
{   
  unsigned char temp;   
  DDRB |= 0x17;    //MISO=input and MOSI,SCK,SS = output,PB4输出用于片选AD7791 
  PORTB |= 0xF8;   //1111 1000 MISO上拉电阻有效,PB4位为高电平    
  SPCR = 0x59;     //SPI允许,主机模式,MSB,极性方式10,1/16系统时钟速率   
  SPSR = 0x00;   
  temp = SPSR;     //清空SPIF标志  
  temp = SPDR;     
 } 
   
 unsigned char spi_tran(unsigned char data)   //发送的同时接受数据 
  { 
    unsigned char clear; 
    SPDR=data; 
    while(!(SPSR&0x80)); 
    clear=SPSR; 
    clear=SPDR; 
    return clear; 
   } 
     
unsigned long read_ad(void)     //读AD芯片数据 
{   unsigned long addata; 
    unsigned long data[3]; 
    unsigned char temp; 
    PORTB&=~0x10;         //片选   
    
    spi_tran(0x10);  //写通讯寄存器表明下一步写模式寄存器(不管写AD中任何寄存器前必须先给 
                       通讯寄存器写数据,再决定下一步是读或写那个寄存器) 
    spi_tran(0x82);  //通过写模式寄存器配置AD芯片为单次转换,有缓冲器(一旦配置完成就开始 
                       进行一次模数转换) 
    do                       //等待一次转换结束(芯片中状态寄存器的最高位变为0表示转换结 
     {                         束,为了读状态寄存器必须先写通讯寄存器) 
       temp=spi_tran(0x08); 
       temp=spi_tran(0x00); 
      } 
     while(temp==0x8C); 
     
     data[0]=(unsigned long)spi_tran(0x00);    //开始连续读出24位转换结果 
     data[1]=(unsigned long)spi_tran(0x00); 
     data[2]=(unsigned long)spi_tran(0x00); 
     addata=(data[0]<<8); 
     addata=(addata<<8); 
     addata|=(data[1]<<8); 
     addata|=data[2]; 
                   
     PORTB|=0x10;       //片选 
     return addata; 
} 

⌨️ 快捷键说明

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