找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2542|回复: 0
打印 上一主题 下一主题
收起左侧

ADS111的STM32驱动程序 含配置代码以及IIC通讯驱动

[复制链接]
跳转到指定楼层
楼主
ID:616761 发表于 2019-9-26 16:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
内含ADS111配置代码以及IIC通讯驱动

单片机源程序如下:
  1. #include "stm32f10x_lib.h"
  2. #include "ADS1115.h"
  3. #include "stm32f10x_i2c.h"
  4. #ifndef __cplusplus  
  5. #endif  
  6. /*--Private Value----------------------------------------------------------*/
  7. enum TestPort {BatVal,BatCur};
  8. unsigned char AD_BUF[2]={0};   
  9. #define SCLH        GPIOB->BSRR = GPIO_Pin_6
  10. #define SCLL        GPIOB->BRR  = GPIO_Pin_6     
  11. #define SDAH        GPIOB->BSRR = GPIO_Pin_7
  12. #define SDAL        GPIOB->BRR  = GPIO_Pin_7   
  13. #define SCLread     GPIOB->IDR  & GPIO_Pin_6
  14. #define SDAread     GPIOB->IDR  & GPIO_Pin_7  
  15. void I2C_GPIO_Config(void)
  16. {   
  17.         GPIO_InitTypeDef  GPIO_InitStructure;      
  18.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   
  19.        
  20.         // Configure I2C1 pins: SCL and SDA   
  21.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;   
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;   
  24.         GPIO_Init(GPIOB, &GPIO_InitStructure);   
  25.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;   
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  27.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
  28.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  29.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;//assert管脚
  30.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  32.         GPIO_Init(GPIOB, &GPIO_InitStructure);        
  33. }

  34. void I2C_delay(void)
  35. {  unsigned char i=30; //
  36.    while(i)
  37.    {
  38.        i--;
  39.    }
  40. }  

  41. bool I2C_Start(void)
  42. {   
  43.         SDAH;
  44.         I2C_delay();  
  45.         SCLH;   
  46.         I2C_delay();  
  47.         if(!SDAread)return FALSE; //SDA线为低则总线忙,退出
  48.         SDAL;   
  49.         I2C_delay();  
  50.         if(SDAread)
  51.         return FALSE; //SDA线为高则总线出错,退出  
  52.         SDAL;   
  53.         I2C_delay();
  54.         return TRUE;       
  55. }  
  56. void I2C_Stop(void)
  57. {  
  58.         SCLL;
  59.         I2C_delay();
  60.         SDAL;  
  61.         I2C_delay();  
  62.         SCLH;  
  63.         I2C_delay();  
  64.         SDAH;  
  65.         I2C_delay();
  66. }  

  67. void I2C_Ack(void)
  68. {   
  69.         SCLL;   
  70.         I2C_delay();  
  71.         SDAL;  
  72.         I2C_delay();
  73.         SCLH;  
  74.         I2C_delay();
  75.         SCLL;   
  76.         I2C_delay();
  77. }  

  78. void I2C_NoAck(void)
  79. {   
  80.         SCLL;
  81.         I2C_delay();
  82.         SDAH;   
  83.         I2C_delay();  
  84.         SCLH;   
  85.         I2C_delay();
  86.         SCLL;   
  87.         I2C_delay();
  88. }

  89. bool I2C_WaitAck(void)  //返回1有ACK,返回0无ACK
  90. {  
  91.         SCLL;  
  92.         I2C_delay();  
  93.         SDAH;     
  94.         I2C_delay();
  95.         SCLH;  
  96.         I2C_delay();
  97.         if(SDAread)
  98.         { SCLL;
  99.           return FALSE;
  100.         }  
  101.         SCLL;
  102.         return TRUE;
  103.         }
  104.        
  105. void I2C_SendByte(u8 SendByte) //数据从高位到低位//
  106. {      
  107.         u8 i=8;  
  108.         while(i--)
  109.         {         
  110.           SCLL;         
  111.           I2C_delay();         
  112.           if(SendByte&0x80)         
  113.           SDAH;         
  114.           else         
  115.           SDAL;         
  116.           SendByte<<=1;        
  117.           I2C_delay();  
  118.                 SCLH;         
  119.           I2C_delay();     
  120.         }      
  121.         SCLL;
  122. }  
  123. u8 I2C_ReceiveByte(void) //数据从高位到低位//
  124. {
  125.         u8 i=8;     
  126.         u8 ReceiveByte=0;   
  127.         SDAH;         
  128.         while(i--)     
  129.         {      
  130.                 ReceiveByte<<=1;            
  131.                 SCLL;        
  132.                 I2C_delay();      
  133.                 SCLH;        
  134.                 I2C_delay();        
  135.                 if(SDAread)      
  136.                 {         
  137.                  ReceiveByte|=0x01;      
  138.                 }     
  139.         }      
  140.         SCLL;     
  141.         return ReceiveByte;
  142. }  
  143. /****************************************************************************
  144. * 名    称: ADS1115_Init
  145. * 功    能: 初始化ADS1115
  146. * 入口参数:id:设备地址;write_address寄存器 ;byte1:高字节配置;byte2:低字节 最高转换速度  
  147. * 出口参数: 无
  148. * 说    明:  完成ADS1115的配置寄存器的初始化
  149. *****************************************************************************/
  150. void ADS1115_Init(unsigned char id,unsigned char write_address,unsigned char byte1,unsigned char byte2)
  151. {   
  152.         while(!I2C_Start());
  153.   I2C_SendByte(id);//写器件地址   
  154.         while(!I2C_WaitAck());   
  155.         I2C_SendByte(write_address);//寄存器地址
  156.         while(!I2C_WaitAck());   
  157.         I2C_SendByte(byte1);//发送数据   
  158.         while(!I2C_WaitAck());   
  159.         I2C_SendByte(byte2);//发送数据   
  160.         while(!I2C_WaitAck());   
  161.         I2C_Stop();         
  162.         I2C_delay();
  163.         I2C_delay();   
  164. }

  165. /****************************************************************************
  166. * 名    称: I2C_AD1115_Point
  167. * 功    能: 指向ADS1115内部特定的寄存器
  168. * 入口参数: id:设备地址;write_address寄存器
  169. * 出口参数: 无  
  170. * 说    明: 指向ADS1115内部特定的寄存器  
  171. ****************************************************************************/
  172. void I2C_AD1115_Point(unsigned char id,unsigned char write_address)
  173. {  
  174.         while(!I2C_Start());  
  175.         //产生起始条件
  176.         I2C_SendByte(id);//写器件地址
  177.         //向设备发送设备地址  
  178.         while(!I2C_WaitAck());  
  179.         //等待ACK   
  180.         I2C_SendByte(write_address);//发送数据
  181.         //寄存器地址
  182.         while(!I2C_WaitAck());   
  183.         I2C_Stop();   
  184.         //产生结束信号
  185. }  
  186. /****************************************************************************
  187. * 名    称: I2C_Read2
  188. * 功    能: 读ADS1115转换结果  
  189. * 入口参数: id:设备地址;read_address寄存器地址
  190. * 出口参数: 无
  191. * 说    明: 转换的值放在BUF【2】
  192. ****************************************************************************/
  193. void I2C_Read2(unsigned char  id, unsigned char read_address)   
  194. {           
  195.         while(!I2C_Start());  
  196.         //产生起始条件
  197.         I2C_SendByte(id);//写器件地址  
  198.         //发送地址   
  199.         while(!I2C_WaitAck());
  200.         //等待ACK           
  201.         AD_BUF[0] = I2C_ReceiveByte();   
  202.         I2C_Ack();   
  203.         AD_BUF[1]  = I2C_ReceiveByte();
  204.         I2C_NoAck();   
  205.         I2C_Stop();
  206. }  
  207. /****************************************************************************
  208. * 名    称: StartChannel
  209. * 功    能: 选择通道测量
  210. * 入口参数: 通道0、1、2、3
  211. * 出口参数: 采样值
  212. * 说    明: 完成ADS1115的采样工作  
  213. ****************************************************************************/

  214. s16 Out,AIN2,AIN1,AIN3,AIN0;
  215. s16 AD_Buff[4];
  216. int temp=0;  
  217. float StartChannlel(char Channel)
  218. {
  219.         float AD_Val=0;
  220.        
  221.         if(Channel==0)
  222.         {   //First (1001000)Address+0; Second :Point to the Config resgister   BatVal
  223.                 ADS1115_Init(0x90,0x01,0xc2,0xe0); //量程4.096;Continuous conversionmode;AIN1
  224.                 //860SPS;
  225.                 Out=AIN0-AIN1;  
  226.         }  
  227.         if(Channel==1)
  228.         {   
  229.                 ADS1115_Init(0x90,0x01,0xd2,0xe0); //量程1.024;Continuous conversionmode;AIN3  BatCur
  230.                 //860SPS;
  231.                 Out=AIN2-AIN3;//00110110
  232.         }   
  233.         if(Channel==2)  
  234.          {   
  235.            ADS1115_Init(0x90,0x01,0xe2,0xe0); //量程4.096;Continuous conversionmode;GND
  236.           //860SPS;  
  237.          }   
  238.          if(Channel==3)   
  239.          {     
  240.            ADS1115_Init(0x90,0x01,0xf2,0xe0); //量程4.096;Continuous conversionmode;GND
  241.           //860SPS;  
  242.    }  
  243.         while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4));
  244.         I2C_AD1115_Point(0x90,0x00);         
  245.         I2C_delay();
  246.         I2C_delay();  
  247.         I2C_Read2(0x91,0x00);
  248.   while(!I2C_Start());           
  249.         temp=(AD_BUF[0] << 8) | AD_BUF[1];
  250. //        AD_Val=4096*temp/32768.0;  
  251.          AD_Val=temp;
  252.          if(Channel==0)
  253.                 {   
  254.                          AD_Buff[0]=AD_Val;
  255.                 }   
  256.                 if(Channel==1)
  257.                 {   
  258.                          AD_Buff[1]=AD_Val;
  259.                 }   
  260.                 if(Channel==2)
  261.                 {   
  262.                          AD_Buff[2]=AD_Val;
  263.                 }   
  264.                 if(Channel==3)
  265.                 {   
  266.                          AD_Buff[3]=AD_Val;
  267.                 }   
  268.         return AD_Val;
  269.          
  270.          
  271. }
  272.        
复制代码

所有资料51hei提供下载:
ADS115.rar (610.13 KB, 下载次数: 39)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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