[资料分享] ADS1115驱动程序--msp430f149

[复制链接]
 楼主| xyz549040622 发表于 2019-12-21 15:55 | 显示全部楼层 |阅读模式
  1. /*
  2. * ADS1115.h
  3. *
  4. *  Created on: 2012-7-30
  5. *      Author: Piao
  6. */

  7. #ifndef ADS1115_H_
  8. #define ADS1115_H_

  9. /**********ADDR宏定义***************/
  10. #define ADDRESS_0  0x90   //ADDR PIN ->GND
  11. #define ADDRESS_1  0x92   //ADDR PIN ->VDD
  12. #define ADDRESS_2  0x94   //ADDR PIN ->SDA
  13. #define ADDRESS_3  0x96   //ADDR PIN ->SCL


  14. /************POINTER REGISTER*****************/
  15. #define Pointer_0  0x00   //Convertion register
  16. #define Pointer_1  0x01   //Config register
  17. #define Pointer_2  0x02   //Lo_thresh register
  18. #define Pointer_3  0x03   //Hi_thresh register

  19. /************CONFIG REGISTER*****************/
  20. #define OS_0   0x0000
  21. #define OS_1   0x8000

  22. #define MUX_0  0x0000  //AINp=AIN0, AINn=AIN1
  23. #define MUX_1  0x1000  //AINp=AIN0, AINn=AIN3
  24. #define MUX_2  0x2000  //AINp=AIN1, AINn=AIN3
  25. #define MUX_3  0x3000  //AINp=AIN2, AINn=AIN3
  26. #define MUX_4  0x4000  //AINp=AIN0, AINn=GND
  27. #define MUX_5  0x5000  //AINp=AIN1, AINn=GND
  28. #define MUX_6  0x6000  //AINp=AIN2, AINn=GND
  29. #define MUX_7  0x7000  //AINp=AIN3, AINn=GND

  30. #define PGA_0  0x0000   //FS=6.144V
  31. #define PGA_1  0x0200   //FS=4.096V
  32. #define PGA_2  0x0400  //FS=2.048V
  33. #define PGA_3  0x0600  //FS=1.024V
  34. #define PGA_4  0x0800  //FS=0.512V
  35. #define PGA_5  0x0A00  //FS=0.256V
  36. #define PGA_6  0x0C00  //FS=0.256V
  37. #define PGA_7  0x0E00  //FS=0.256V

  38. #define MODE_0 0x0000
  39. #define MODE_1 0x0100

  40. #define DR_0   0x0000   //Data Rate = 8
  41. #define DR_1   0x0020   //Data Rate = 16
  42. #define DR_2   0x0040   //Data Rate = 32
  43. #define DR_3   0x0060   //Data Rate = 64
  44. #define DR_4   0x0080   //Data Rate = 128
  45. #define DR_5   0x00A0   //Data Rate = 250
  46. #define DR_6   0x00C0   //Data Rate = 475
  47. #define DR_7   0x00E0   //Data Rate = 860

  48. #define COMP_MODE_0  0x0000
  49. #define COMP_MODE_1  0x0010

  50. #define COMP_POL_0   0x0000
  51. #define COMP_POL_1   0x0008

  52. #define COMP_LAT_0   0x0000
  53. #define COMP_LAT_1   0x0040

  54. #define COMP_QUE_0   0x0000
  55. #define COMP_QUE_1   0x0001
  56. #define COMP_QUE_2   0x0002
  57. #define COMP_QUE_3   0x0003


  58. void Delay(void);
  59. void Delay_1ms(void);
  60. void Start(void);
  61. void Stop(void);
  62. void ACK(void);
  63. void NACK(void);
  64. unsigned char Check(void);
  65. void Write_1_Byte(unsigned char DataByte);
  66. unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n);
  67. unsigned char Read_1_Byte(void);
  68. void Read_N_Byte(unsigned int *readbuff,unsigned char n);
  69. void InitADS1115(void);
  70. void WriteWord(void);
  71. void ReadWord(void);
  72. void ADS1115(void);
  73. void ShowInt(long int x);


  74. #endif /* ADS1115_H_ */






  75. #include <MSP430F149.h>
  76. #include "ADS1115.h"

  77. /************************************
  78. *   ADDR---> GND
  79. *   VDD ---> 3.3V
  80. *   SCL ---> P2.6
  81. *   SDA ---> P2.7
  82. *   AINp=AIN0, AINn=GND
  83. ************************************/


  84. /***************引脚定义*****************/
  85. #define SCL              0x40
  86. #define SDA              0x80

  87. #define SCL_SEL          P2SEL &= ~SCL
  88. #define SCL_DDR_OUT           P2DIR |= SCL
  89. #define SCL_OUT          P2OUT
  90. #define SCL_H             SCL_OUT |= SCL
  91. #define SCL_L                  SCL_OUT &= ~SCL

  92. #define SDA_SEL          P2SEL &= ~SDA
  93. #define SDA_DDR_OUT            P2DIR |= SDA
  94. #define SDA_DDR_IN       P2DIR &=  ~SDA
  95. #define SDA_OUT          P2OUT
  96. #define SDA_IN           P2IN
  97. #define SDA_H             SDA_OUT |= SDA
  98. #define SDA_L                   SDA_OUT &= ~SDA

  99. #define TRUE   1
  100. #define FALSE  0

  101. /*************ADDR Initial********************/
  102. #define ADDRESS    ADDRESS_0   //ADDR PIN ->GND
  103. #define ADDRESS_W  ADDRESS |0x00  //写地址
  104. #define ADDRESS_R  ADDRESS|0x01    //读地址

  105. /*************Config Initial*********************/
  106. #define OS         OS_1
  107. #define MUX        MUX_4      //AINp=AIN0, AINn=GND
  108. #define PGA        PGA_0      //FS=6.144V
  109. #define DR         DR_7       //Data Rate = 860
  110. #define COMP_QUE   COMP_QUE_3


  111. unsigned int Config;
  112. unsigned char Writebuff[4],Readbuff[3];
  113. unsigned int Result[2];
  114. int D_ADS; //转换的数字量
  115. float VIN_DAS; //输入的电压值
  116. unsigned char  t_DAS;
  117. int  Format[5]={0};  //转换的数字量转换成十进制


  118. /*******************************************
  119. 函数名称:delay
  120. 功    能:延时约15us的时间
  121. 参    数:无
  122. 返回值  :无
  123. ********************************************/
  124. void Delay(void)
  125. {
  126.     unsigned char i;
  127.    
  128.     for(i = 0;i < 15;i++)
  129.       _NOP();
  130. }       

  131. /******************延时1ms的时间*********************/
  132. void Delay_1ms(void)
  133. {
  134.         unsigned char i;
  135.         for(i = 150;i > 0;i--)          _NOP();
  136. }


  137. /*******************************************
  138. 函数名称:Start
  139. 功    能:完成IIC的起始条件操作
  140. 参    数:无
  141. 返回值  :无
  142. ********************************************/
  143. void Start(void)
  144. {
  145.         SCL_H;
  146.         SDA_H;
  147.         Delay();
  148.         SDA_L;
  149.         Delay();
  150.         SCL_L;
  151.         Delay();
  152. }

  153. /*******************************************
  154. 函数名称:Stop
  155. 功    能:完成IIC的终止条件操作
  156. 参    数:无
  157. 返回值  :无
  158. ********************************************/
  159. void Stop(void)
  160. {
  161.         SDA_L;
  162.         Delay();
  163.         SCL_H;
  164.         Delay();
  165.         SDA_H;
  166.         Delay();
  167. }


  168. /*******************************************
  169. 函数名称:ACK
  170. 功    能:完成IIC的主机应答操作
  171. 参    数:无
  172. 返回值  :无
  173. ********************************************/
  174. void ACK(void)
  175. {
  176.         SDA_L;
  177.         _NOP(); _NOP();
  178.         SCL_H;
  179.         Delay();
  180.         SCL_L;
  181.         _NOP(); _NOP();
  182.         SDA_H;
  183.         Delay();
  184. }

  185. /*******************************************
  186. 函数名称:NACK
  187. 功    能:完成IIC的主机无应答操作
  188. 参    数:无
  189. 返回值  :无
  190. ********************************************/
  191. void NACK(void)
  192. {
  193.         SDA_H;
  194.         _NOP(); _NOP();
  195.         SCL_H;
  196.         Delay();
  197.         SCL_L;
  198.         _NOP(); _NOP();
  199.         SDA_L;   
  200.         Delay();      
  201. }

  202. /**********检查应答信号函数******************/
  203. /*如果返回值为1则证明有应答信号,反之没有*/
  204. /*******************************************
  205. 函数名称:Check
  206. 功    能:检查从机的应答操作
  207. 参    数:无
  208. 返回值  :从机是否有应答:1--有,0--无
  209. ********************************************/
  210. unsigned char Check(void)
  211. {
  212.     unsigned char slaveack;
  213.    
  214.     SDA_H;
  215.     _NOP(); _NOP();
  216.     SCL_H;
  217.     _NOP(); _NOP();
  218.     SDA_DDR_IN;
  219.     _NOP(); _NOP();
  220.     slaveack = SDA_IN&SDA;   //读入SDA数值
  221.     SCL_L;
  222.     Delay();
  223.     SDA_DDR_OUT;
  224.     if(slaveack)    return FALSE;
  225.     else            return TRUE;
  226. }

  227. /***************Write a Byte****************/
  228. void Write_1_Byte(unsigned char DataByte)
  229. {
  230.         int i;

  231.         for(i=0;i<8;i++)
  232.         {
  233.                 if(DataByte&0x80)  //if((DataByte<<i)&0x80)
  234.                   SDA_H;
  235.                 else
  236.                   SDA_L;
  237.         Delay();
  238.         SCL_H;
  239.         Delay();
  240.         SCL_L;
  241.         Delay();
  242.         DataByte <<= 1;
  243.         }
  244.         SDA_H;
  245.         _NOP();
  246. }

  247. /***************Write N Byte****************/
  248. unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n)
  249. {
  250.         int i;

  251.         for(i=0;i<n;i++)
  252.         {
  253.                 Write_1_Byte(*writebuffer);
  254.                 if(Check())
  255.                 {
  256.                         writebuffer ++;
  257.                 }
  258.                 else
  259.                 {
  260.                         Stop();
  261.                     return FALSE;
  262.                 }
  263.         }
  264.         Stop();
  265.         return TRUE;
  266. }

  267. /***************Read a Byte****************/
  268. unsigned char Read_1_Byte(void)
  269. {
  270.     unsigned char data=0,FLAG, i;
  271.        
  272.     for(i=0;i<8;i++)
  273.     {
  274.         
  275.         SDA_H;
  276.         Delay();
  277.         SCL_H;
  278.         SDA_DDR_IN; //端口为输入
  279.         Delay();
  280.         FLAG=SDA_IN& SDA;
  281.         data <<= 1;
  282.         if( FLAG)
  283.            data |= 0x01;
  284.         SDA_DDR_OUT;
  285.         SCL_L;
  286.         Delay();
  287.     }
  288.     return data;
  289. }

  290. /***************Read N Byte****************/
  291. void Read_N_Byte(unsigned int*readbuff,unsigned char n)
  292. {
  293.         unsigned char i;
  294.        
  295.         for(i=0;i<n;i++)
  296.         {
  297.                 readbuff[i]=Read_1_Byte();
  298.                 if(i==n-1)
  299.                         NACK();  //不连续读字节
  300.                 else
  301.                         ACK(); //连续读字节
  302.         }
  303.         Stop();

  304. }


  305. /*****************初始化******************/
  306. void InitADS1115(void)
  307. {
  308.     SCL_SEL;
  309.     SDA_SEL;
  310.     SCL_DDR_OUT;
  311.     SDA_DDR_OUT;
  312.     SDA_H;
  313.     Config = OS+MUX+PGA+DR+COMP_QUE;
  314.     Writebuff[0]=ADDRESS_W;
  315.     Writebuff[1]=Pointer_1;
  316.     Writebuff[2]=Config/256;
  317.     Writebuff[3]=Config%256;
  318.         
  319.     Readbuff[0]=ADDRESS_W;
  320.     Readbuff[1]=Pointer_0;
  321.         
  322.     Readbuff[2]=ADDRESS_R;
  323. }

  324. /***************Write a Word***********************/
  325. void WriteWord(void)
  326. {
  327.      int t;
  328.      Start();   //写入4个字节
  329.      do
  330.      {
  331.           t=Write_N_Byte(Writebuff,4);
  332.      }while(t==0);
  333. }

  334. /***************Read Word***********************/
  335. void ReadWord(void)
  336. {
  337.     int t;
  338.     Start();  //写入2个字节
  339.     do
  340.     {
  341.       t=Write_N_Byte(Readbuff,2);
  342.     }while(t==0);

  343.     Start();   //写入2个字节
  344.     do
  345.     {
  346.       t=Write_N_Byte(&Readbuff[2],1);
  347.     }while(t==0);
  348.    
  349.     Read_N_Byte(Result,2);  //读出2个字节

  350. }

  351. /***************ADS1115********************/
  352. void ADS1115(void)
  353. {
  354.     InitADS1115();
  355.     WriteWord();
  356.     Delay_1ms();
  357.     ReadWord();
  358.        
  359.     D_ADS=Result[0]*256+Result[1];  //转换的数字量
  360.     t_DAS=0;
  361.     ShowInt(D_ADS);    //转换的数字量转换成十进制
  362.     VIN_DAS=6.144*D_ADS/32768;  //输入的电压值
  363. }

  364. //用递归方法将正整数x转换为10进制格式
  365. void ShowInt(long int x)
  366. {
  367.         if(x)
  368.         {
  369.           Format[t_DAS]= x%10;
  370.           t_DAS  ++;
  371.           ShowInt(x/10);
  372.         }
  373. }






 楼主| xyz549040622 发表于 2019-12-21 15:55 | 显示全部楼层

本帖子中包含更多资源

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

×
ayl439 发表于 2024-2-20 22:31 | 显示全部楼层
谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2841

主题

19330

帖子

110

粉丝
快速回复 在线客服 返回列表 返回顶部