【求助】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
I2C程序有问题,没看到你的ACK指令。 randyzzy 发表于 2015-5-27 18:52
I2C程序有问题,没看到你的ACK指令。
老大,人家是SPI协议…… 看程序很难发现错误的,如果条件允许的话挂上示波器看波形吧。祝你早日成功 不好意思,我用过ADS1110,没仔细看。1110是I2C协议的。
页:
[1]