数码之家

 找回密码
 立即注册
搜索
查看: 3232|回复: 4

[STM] SGM58031替代ADS1115是否要修改程序? 请看下面的ADS1115模拟IIC驱动。

[复制链接]
发表于 2022-4-18 16:08:32 | 显示全部楼层 |阅读模式

#include "stm32f10x_conf.h"
#include "delay.h"

#define SCL_1   GPIO_SetBits(GPIOC,GPIO_Pin_14)
#define SCL_0   GPIO_ResetBits(GPIOC,GPIO_Pin_14)
#define SDA_1   GPIO_SetBits(GPIOC,GPIO_Pin_15)
#define SDA_0   GPIO_ResetBits(GPIOC,GPIO_Pin_15)
#define SDA_dat GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)  //读入SDA数值

#define TRUE  1
#define FALSE 0

#define ADDRESS_0   0x90 //ADDR PIN ->GND
#define ADDRESS_1   0x92 //ADDR PIN ->VDD
#define ADDRESS_2   0x94 //ADDR PIN ->SDA
#define ADDRESS_3   0x96 //ADDR PIN ->SCL

#define ADDRESS0    ADDRESS_0    //ADDR PIN ->GND  
#define ADDRESS_W   ADDRESS0|0x00 //写地址
#define ADDRESS_R   ADDRESS0|0x01 //读地址

#define Pointer_0   0x00 //Convertion register
#define Pointer_1   0x01 //Config register
#define Pointer_2   0x02 //Lo_thresh register
#define Pointer_3   0x03 //Hi_thresh register

#define OS_0        0x0000
#define OS_1        0x8000
#define MUX_0       0x0000 //AINp=AIN0, AINn=AIN1
#define MUX_1       0x1000 //AINp=AIN0, AINn=AIN3
#define MUX_2       0x2000 //AINp=AIN1, AINn=AIN3
#define MUX_3       0x3000 //AINp=AIN2, AINn=AIN3
#define MUX_4       0x4000 //AINp=AIN0, AINn=GND
#define MUX_5       0x5000 //AINp=AIN1, AINn=GND
#define MUX_6       0x6000 //AINp=AIN2, AINn=GND
#define MUX_7       0x7000 //AINp=AIN3, AINn=GND

#define PGA_0       0x0000 //FS=6.144V
#define PGA_1       0x0200 //FS=4.096V
#define PGA_2       0x0400 //FS=2.048V
#define PGA_3       0x0600 //FS=1.024V
#define PGA_4       0x0800 //FS=0.512V
#define PGA_5       0x0A00 //FS=0.256V
#define PGA_6       0x0C00 //FS=0.256V
#define PGA_7       0x0E00 //FS=0.256V

#define DR_0        0x0000 //Data Rate = 8
#define DR_1        0x0020 //Data Rate = 16
#define DR_2        0x0040 //Data Rate = 32
#define DR_3        0x0060 //Data Rate = 64
#define DR_4        0x0080 //Data Rate = 128
#define DR_5        0x00A0 //Data Rate = 250
#define DR_6        0x00C0 //Data Rate = 475
#define DR_7        0x00E0 //Data Rate = 860

#define COMP_MODE_0 0x0000 //0 : Traditional comparator with hysteresis (default)
#define COMP_MODE_1 0x0010 //1 : Window comparator
#define COMP_POL_0  0x0000 //0 : Active low (default)
#define COMP_POL_1  0x0008 //1 : Active hig
#define COMP_LAT_0  0x0000 //0 : Non-latching comparator (default)
#define COMP_LAT_1  0x0040 //1 : Latching comparator
#define COMP_QUE_0  0x0000 //00 : Assert after one conversion
#define COMP_QUE_1  0x0001 //01 : Assert after two conversions
#define COMP_QUE_2  0x0002 //10 : Assert after four conversions
#define COMP_QUE_3  0x0003 //11 : Disable comparator (default)

#define MODE_0      0x0000 //0:连续转换模式
#define MODE_1      0x0100 //1:断电单发模式(默认)

unsigned int  Result[2];
unsigned char Readbuff[3];
unsigned char Writebuff[4];

//初始化IIC
void ads1115_IIC_Init(void)
{                               
        GPIO_InitTypeDef GPIO_InitStructure;  //定义GPIO初始化结构体
                 
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14|GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
}

void Start(void)
{  
        SCL_1;
        SDA_1;  
        delay_us(15);  
        SDA_0;  
        delay_us(15);  
        SCL_0;  
        delay_us(15);
}

void Stop(void)
{
        SDA_0;  
        delay_us(15);
        SCL_1;  
        delay_us(15);  
        SDA_1;  
        delay_us(15);  
}

void ACK(void)
{  
        SDA_0;  
         __nop();  __nop();  
        SCL_1;  
        delay_us(15);
        SCL_0;
         __nop();  __nop();
        SDA_1;  
        delay_us(15);
}  

void NACK(void)
{
        SDA_1;
         __nop();  __nop();
        SCL_1;
        delay_us(15);
        SCL_0;
         __nop();  __nop();
        SDA_0;
        delay_us(15);
}

unsigned char Check(void)
{  
        unsigned char slaveack;

        SDA_1;  
         __nop();  __nop();  
        SCL_1;  
         __nop();  __nop();
         __nop();  __nop();  
        slaveack = SDA_dat;
        SCL_0;  
         __nop();  __nop();
         __nop();  __nop();
        if(slaveack)
        return FALSE;
        else
        return TRUE;
}  

void Write_1_Byte(unsigned char DataByte)
{  
  unsigned int i;

        for(i=0;i<8;i++)  
        {  
        if(DataByte&0x80) //if((DataByte<<i)&0x80)  
        SDA_1;  
        else
        SDA_0;
        __nop();
        SCL_1;  
        __nop();
        SCL_0;  
        __nop();
        DataByte <<= 1;  
        }  
        SDA_1;
        __nop();  
}  

unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n)
{
  unsigned int i;

   for(i=0;i<n;i++)  
   {
    Write_1_Byte(*writebuffer);
    if(Check())
    {
     writebuffer ++;
    }
   else
   {
    Stop();
    return FALSE;  
   }
  }
  Stop();  
  return TRUE;
}

unsigned char Read_1_Byte(void)
{  
  unsigned char data_Value = 0,FLAG,i;

  for(i=0;i<8;i++)
   {
                SDA_1;
                __nop();
                SCL_1;
                __nop();
                data_Value <<= 1;
                FLAG=SDA_dat;
                if( FLAG)
                data_Value |= 0x01;
                SCL_0;  
                __nop();
    }  
   return data_Value;
}

void Read_N_Byte(unsigned int*readbuff, unsigned char n)
{  
        unsigned char i;

        for(i=0;i<n;i++)
        {
         readbuff=Read_1_Byte();
         if(i==n-1)
          NACK(); //不连续读字节
         else
          ACK(); //连续读字节
        }  
        Stop();  
}  

void WriteWord(void)
{  
        unsigned int t;  

        Start(); //写入4个字节
        do
        {  
                t=Write_N_Byte(Writebuff,4);
        }
        while(t==0);
}

void ReadWord(void)
{  
        int t;  

        Start(); //写入2个字节
        do
        {  
         t=Write_N_Byte(Readbuff,2);
        }while(t==0);
        Start();
        //写入2个字节
         do
        {  
         t=Write_N_Byte(&Readbuff[2],1);
        }
  while(t==0);
        Read_N_Byte(Result,2); //读出2个字节
}  

void InitADS1115(unsigned char CH)
{
        unsigned int  Config;  

        if(CH == 0){Config = OS_1+MUX_3+PGA_2+DR_7+COMP_QUE_3+MODE_1;} //AINp=AIN2, AINn=AIN3 差分输入模式 FS = 2.048V
        if(CH == 1){Config = OS_1+MUX_4+PGA_2+DR_7+COMP_QUE_3+MODE_1;} //AINp=AIN0, AINn=GND  单端输入模式 FS = 2.048V
        if(CH == 2){Config = OS_1+MUX_5+PGA_2+DR_7+COMP_QUE_3+MODE_1;} //AINp=AIN1, AINn=GND  单端输入模式 FS = 2.048V
        if(CH == 3){Config = OS_1+MUX_5+PGA_3+DR_7+COMP_QUE_3+MODE_1;} //AINp=AIN1, AINn=GND  单端输入模式 FS = 1.024V

        Writebuff[0] = ADDRESS_W;
        Writebuff[1] = Pointer_1;
        Writebuff[2] = Config/256;
        Writebuff[3] = Config%256;
        Readbuff[0] = ADDRESS_W;
        Readbuff[1] = Pointer_0;
        Readbuff[2] = ADDRESS_R;
}

unsigned int ADS1115(unsigned char CH)
{  
        unsigned int ADC_DAT;

        InitADS1115(CH);
        WriteWord();
        delay_ms(1);
        ReadWord();

        ADC_DAT=Result[0]*256+Result[1];   //转换值
  if(ADC_DAT >= 0xffff){ADC_DAT=0;}  //寄存器溢出
        return ADC_DAT;
}



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2022-4-19 21:22:19 | 显示全部楼层
不知道。。帮顶
回复 支持 反对

使用道具 举报

发表于 2022-4-26 09:40:42 | 显示全部楼层
你可以参照一下,我没权限下载。https://download.csdn.net/download/yangshoot/19725987
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-26 16:50:58 | 显示全部楼层





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2022-4-29 09:39:20 | 显示全部楼层
你这SDA没有切换输入输出模式能用吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-10 19:40 , Processed in 0.202800 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表