[资料分享] ads1110驱动程序--msp430x22x4

[复制链接]
2288|24
 楼主| xyz549040622 发表于 2019-12-21 09:56 | 显示全部楼层 |阅读模式
本帖最后由 xyz549040622 于 2019-12-21 15:45 编辑
  1. #include "msp430x22x4.h"
  2. #include "uart.h"
  3. #include "ads1110.h"
  4. #include "delay.h"

  5. void ads_initial(void)
  6. {
  7.   SDA_1;
  8.   SCL_1;
  9.   P2DIR |= 0X03;
  10.   delay_ms(1);
  11.   ads_config(0x1C);
  12. }


  13. /***************************************************************************/                        
  14. /*    函数原型: void ads_start (void)                                                                  */
  15. /*    功    能: 提供I2C总线工作时序中的起始位。                            */  
  16. /***************************************************************************/            
  17. void ads_start (void) //在SCL高的情况下,SDA由高到低的变化造成START。
  18.   {
  19.         SDA_1;
  20.         delay_5us();
  21.         SCL_1;
  22.         delay_5us();
  23.         SDA_0;
  24.         delay_5us();
  25.         SCL_0;
  26.         delay_5us();
  27.   }
  28.   
  29. /**************************************************************************/
  30. /*    函数原型: void ads_stop(void)                                                                    */
  31. /*    功    能: 提供I2C总线工作时序中的停止位。                                                      */
  32. /**************************************************************************/
  33. void ads_stop(void) //在SCL高的情况下,SDA由低到高的变化造成STOP。
  34.   {
  35.         SDA_0;
  36.         delay_5us();
  37.         SCL_1;
  38.         delay_5us();
  39.         SDA_1;
  40.         delay_5us();
  41.   }
  42.   
  43. /*****************************************************************************/
  44. /*    函数原型: unsigned char ack_check(void)                                                                          */
  45. /*    功    能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状*/
  46. /*              态。本函数用于数据发送时的确认检查。                                         */
  47. /*****************************************************************************/
  48. unsigned char ack_check(void) // 检查应答信号
  49.   {
  50.   unsigned char ack_temp=0;
  51.     SDA_IN;
  52.         delay_5us();
  53.         SCL_1;
  54.         delay_5us();
  55.         if (SDA == 1)
  56.         {
  57.          ack_temp = 1;
  58.         }
  59.         else
  60.         {
  61.          ack_temp = 0;
  62.         }
  63.         delay_5us();
  64.         SCL_0;
  65.         delay_5us();
  66.         SDA_0;
  67.         SDA_OUT;
  68.         return(ack_temp);  // 如果收到ACK应答则返回0, 否则返回1。                 
  69.   }
  70. /*****************************************************************************/
  71. /*    函数原型: void ack(void)                                                                                  */
  72. /*    功    能: 提供I2C总线的时钟信号。本函数可用于数据接受时的确认。            */
  73. /*****************************************************************************/
  74. void ack(void)
  75. {
  76.         SDA_OUT;
  77.         SDA_0;
  78.         delay_5us();
  79.         SCL_1;
  80.         delay_5us();
  81.         delay_5us();
  82.         SCL_0;
  83.         delay_5us();
  84. }
  85. /****************************************************************************/
  86. /*    函数原型: unsigned char ads_sendbyte(unsigned char data)                                                     */
  87. /*    功    能: 向I2C总线发送8位数据。                                                              */
  88. /****************************************************************************/
  89. unsigned char ads_sendbyte(unsigned char data) // 发送一个字节
  90.   {
  91.         unsigned char bitcount = 8;         // 发送8位数据。
  92.     do
  93.     {
  94.        if((data&0x80)==0x80)  //   从左到右选送D7,屏蔽D0~D6。
  95.          {
  96.            SDA_1;                           //写 1
  97.          }
  98.        else
  99.          {
  100.            SDA_0;                       //写 0
  101.          }
  102.                 delay_5us();
  103.                 SCL_1;
  104.                 delay_5us();
  105.                 delay_5us();
  106.                 SCL_0;
  107.                 delay_5us();
  108.                 data=data<<1;              //   待送数据左移一位.
  109.                 bitcount--;
  110.         } while(bitcount);
  111.         if( ack_check() == 0 )
  112.         {
  113.                 return 0;
  114.         }else
  115.         {        
  116.                 return 1;                  //返回值为0表示正确发送
  117.         }
  118.   }
  119. /***************************************************************************/
  120. /*    函数原型: unsigned char ads_recivebyte(void)                                                                   */
  121. /*    功    能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节  */
  122. /*              返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信 */
  123. /*              号线处于浮置状态, 即使8052的Px.x脚置1。                                    */
  124. /***************************************************************************/
  125. unsigned char ads_recivebyte(void) //接受一个字节
  126.   {
  127.         SDA_IN;
  128.         unsigned char data=0X00;
  129.         unsigned char bitcount=8;
  130.         do
  131.         {         SCL_1;
  132.                 delay_5us();
  133.                 if(SDA != 0) //读 1
  134.                   {
  135.                         data = data|0x01;
  136.               }
  137.                 else //读 0
  138.                   {
  139.                         data = data&0xfe;
  140.           }
  141.                 delay_5us();
  142.                 SCL_0;
  143.                 delay_5us();
  144.                 delay_5us();
  145.                 if(bitcount-1)
  146.                   {
  147.                         data=data<<1;
  148.                   }
  149.                         bitcount--;
  150.         }
  151.         while(bitcount);
  152.         
  153.         ack();
  154.     return(data);
  155.   }
  156. /****************************************************************************/
  157. /*    函数原型: void ads_config(unsigned char data)                                                                     */
  158. /*    功    能: 写器件地址和配置字。                                            */
  159. /****************************************************************************/
  160. void ads_config(unsigned char data)         
  161.   {
  162.         ads_start();                   //开始写
  163.         ads_sendbyte(0x94);            //写器件地址(写) 1001xxx1   写          1001xxx0   读
  164.                                                                                               //添加调试信息,判断是否发送成功
  165.         
  166.         
  167.         ads_sendbyte(data);            //写配置字


  168.         
  169.     ads_stop();             //结束写
  170.   }

  171. /****************************************************************************/
  172. /*    函数原型: unsigned int ads_result(void)                                                                            */
  173. /*    功    能: 数据读取。                                                        */
  174. /****************************************************************************/
  175. unsigned int ads_result(void)               
  176.   {
  177.         unsigned int result = 0;
  178.         unsigned char result_hi=0;
  179.         unsigned char result_lo=0;
  180.         ads_start();                   //开始读
  181.         ads_sendbyte(0x95);            //写器件地址(读)                1001xxx0   写          1001xxx1   读

  182.         
  183.         result_hi = ads_recivebyte();         // 读高8位
  184.         result_lo = ads_recivebyte();         //读低8位
  185.         ads_recivebyte(); //读配置字
  186.         
  187.         ads_stop();                                 //结束读
  188.         
  189.         
  190.         result = (((unsigned int)result_hi) << 8) + ((unsigned int)result_lo)  ;
  191.         return result;
  192.   }

  193.   
  194.   void ads_convert(void)
  195.   {
  196.         ads_config(0x9C);
  197.   }





 楼主| xyz549040622 发表于 2019-12-21 09:57 | 显示全部楼层
  1. #ifndef __ADS_H              //
  2. #define __ADS_H              //

  3. #define SDA_1  P2OUT|=0X01    //SDA线置高
  4. #define SDA_0  P2OUT&=0XFE    //SDA线置低
  5. #define SCL_1  P2OUT|=0X02    //SCL线置高
  6. #define SCL_0  P2OUT&=0XFD    //SCL线置低
  7. #define SDA    P2IN&0X01     //SDA线
  8. #define SCL    P2IN&0x02

  9. #define SDA_IN  P2DIR&=0XFE   //SDA线 输入
  10. #define SDA_OUT P2DIR|=0X01   //SDA线 输出


  11. void ads_config(unsigned char);
  12. unsigned int ads_result(void);
  13. void ads_initial(void);
  14. void ads_convert(void);

  15. #endif
 楼主| xyz549040622 发表于 2019-12-21 10:16 | 显示全部楼层

本帖子中包含更多资源

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

×
 楼主| xyz549040622 发表于 2019-12-21 14:37 | 显示全部楼层

本帖子中包含更多资源

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

×
externally 发表于 2019-12-23 19:39 | 显示全部楼层
感谢楼主分享!学习一下
aspoke 发表于 2020-1-10 16:43 | 显示全部楼层

ADS1110怎么不能转换大于2.047V的电压   
232321122 发表于 2020-1-10 16:44 | 显示全部楼层
ADS1110为什么这么贵   
ghuca 发表于 2020-1-10 16:44 | 显示全部楼层
ADS1110如何将输出码转为电压
soodesyt 发表于 2020-1-10 16:44 | 显示全部楼层
ADS1110A0使用430单片机模拟IIC读出的数怎么是65535
mnynt121 发表于 2020-1-10 16:44 | 显示全部楼层
要用ADS1110进行AD转换   
plsbackup 发表于 2020-1-10 16:45 | 显示全部楼层
ADS1110无法工作           
kmzuaz 发表于 2020-1-10 16:45 | 显示全部楼层
可以与 16位 AD 连接么?   
qiufengsd 发表于 2020-1-10 16:45 | 显示全部楼层
基准直接用Vcc,会有各种干扰  
wengh2016 发表于 2020-1-10 16:46 | 显示全部楼层
取多次的平均值了吗        
sanfuzi 发表于 2020-1-10 16:46 | 显示全部楼层
谢谢楼主分享的资料。   
aspoke 发表于 2020-1-10 16:46 | 显示全部楼层
AD转换ADS1110与ADS1115的区别   
plsbackup 发表于 2020-1-10 16:46 | 显示全部楼层
ADS1110 转换不准   
kmzuaz 发表于 2020-1-10 16:46 | 显示全部楼层
ADS1110操作只能读出第一个字节   
mnynt121 发表于 2020-1-10 16:46 | 显示全部楼层
将数据通过I2C总线  
qiufengsd 发表于 2020-1-10 16:46 | 显示全部楼层
Vcc本身也不是很稳定的?     
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2841

主题

19330

帖子

110

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