【求助】51单片机模拟spi协议控制ADS1118没有反应

2020-01-20 18:59发布

想用ADS1118测量电压,液晶显示,液晶模块调试过了,但是ADS1118有问题,求大神指教
——————————————————————————————————————————————————————分割线——————————————————————————————————————————————————————
/*ads1118.c文件*/

#include "ads1118.h"


void delay_ms(unsigned int z)
{
        unsigned int x;
        for(;z>0;z--)
        for(x=110;x>0;x--);
}

void ADS1118_Init(void)
{
        CS_H;                                           //ADS1118进行初始化
        SCLK_H;
        MOSI_L;
        Write_ADS1118(CONFIG_VALUE);
}

        void Write_ADS1118(unsigned int send_dat)
{
        unsigned char i;
        SCLK_L;                         //CPOL = 0,空闲状态为0
        CS_L;                         //片选使能
        delay_ms(1);
        for(i=0;i<16;i++)
        {
                if(send_dat & 0x8000)        //从最高位开始送信号,每次都只判断最高位
                        MOSI_H;
                else
                        MOSI_L;
                send_dat <<= 1;   //已经把最高位送给MOSI变量,进行左移,次高位变为最高位
                _nop_();  //延时一个机器周期
                SCLK_H;          //拉高时钟,此时应为读操作,这次不做操作
                _nop_();  
                SCLK_L;          //拉低时钟,此时为写操作,将最高位送入了芯片中
        }
        CS_H;
        SCLK_H;
        MOSI_L;
        MISO_L;       
}

  unsigned int Read_ADS1118()
  {
          unsigned char i;
          unsigned int rec_dat;
          SCLK_L;                         //CPOL = 0,空闲状态为0
        CS_L;                         //片选使能
        _nop_();
        for(i=0;i<16;i++)
        {
                _nop_();  //延时一个机器周期
                SCLK_H;          //拉高时钟,进行读操作
                rec_dat <<= 1;            
                if(READ_MISO)
                rec_dat |= 0x01;
                _nop_();  
                SCLK_L;          //拉低时钟,此时为写操作,这次不做事
        }
        CS_H;
        SCLK_H;
        MOSI_L;
        MISO_L;
        return(rec_dat);
  }

————————————————————————————————————————————————————————————————分割线——————————————————————————————————————————————
/*ads1118.h文件*/
#ifndef __ADS1118_H__
#define __ADS1118_H__

#include <reg52.h>
#include <intrins.h>

#define CONFIG_VALUE    0X018B       //AIN0-AIN1  4.096  128sps  pull on DOUT


sbit SCLK = P2^1;
sbit MOSI = P2^2;
sbit MISO = P2^3;
sbit CS   = P2^0;

#define SCLK_H     SCLK = 1
#define SCLK_L     SCLK = 0

#define MOSI_H     MOSI = 1
#define MOSI_L     MOSI = 0

#define MISO_H     MISO = 1
#define MISO_L     MISO = 0

#define CS_H       CS = 1
#define CS_L       CS = 0

#define READ_MISO  P2 & 0X8  

extern void ADS1118_Init(void);
extern void Write_ADS1118(unsigned int dat);
extern unsigned int Read_ADS1118();

#endif

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
randyzzy
1楼-- · 2020-01-21 00:03
 精彩回答 2  元偷偷看……
xintao
2楼-- · 2020-01-21 04:41
randyzzy 发表于 2015-5-27 18:52
I2C程序有问题,没看到你的ACK指令。

老大,人家是SPI协议……
-阿发-
3楼-- · 2020-01-21 06:13
看程序很难发现错误的,如果条件允许的话挂上示波器看波形吧。祝你早日成功
randyzzy
4楼-- · 2020-01-21 09:18
不好意思,我用过ADS1110,没仔细看。1110是I2C协议的。

一周热门 更多>