皇阿宝 发表于 2015-5-27 17:55:03

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

想用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-AIN14.096128spspull 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_MISOP2 & 0X8

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

#endif

randyzzy 发表于 2015-5-27 18:52:46

I2C程序有问题,没看到你的ACK指令。

xintao 发表于 2015-5-27 19:15:28

randyzzy 发表于 2015-5-27 18:52
I2C程序有问题,没看到你的ACK指令。

老大,人家是SPI协议……

-阿发- 发表于 2015-5-27 19:33:32

看程序很难发现错误的,如果条件允许的话挂上示波器看波形吧。祝你早日成功

randyzzy 发表于 2015-5-27 21:01:05

不好意思,我用过ADS1110,没仔细看。1110是I2C协议的。
页: [1]
查看完整版本: 【求助】51单片机模拟spi协议控制ADS1118没有反应