找回密码
 立即注册

QQ登录

只需一步,快速开始

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

MSP430单片机的ADS7841驱动程序

[复制链接]
跳转到指定楼层
楼主
ID:51337 发表于 2013-7-14 16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. 基于MSP430的ADS7841驱动程序
  2. ~正常应该在下降沿写指令,上升沿读数据!
  3. 切记:仔细观察时序,配置字结束后的第一个时钟的数据是无用数据,应该左移抛弃
  4. ,下面是代码部分。
  5. *****************************************************************************
  6. ** 函数原型:unsigned int ADS7841_Read_Data(unsigned char Channel);
  7. ** 功    能:SPI总线的A/D ADS7841 驱动程序
  8. ** 入口参数:unsigned char Channel   表示选择读取通道
  9. ** 出口参数:unsigned int   返回所读取得12位数据。
  10. ** 说    明:ADS7841为12位A/D,先对其进行设置:数据位D0---D7,其中D0---D1是
  11. **           设置ADC的功耗模式,D2是模拟输入通道设置,H为4个单通道,L为两个
  12. **           差分输入,D3为mode,当mode(pin)接地时为12位采样方式,接高电平时
  13. **           mode为1时8位采集,为0时12位采集,D4---D6为输入通道选择,D7为起始位
  14. **-----------------------------------------------------------------------------
  15. ** 修 改 人:
  16. ** 日  期:
  17. *******************************************************************************/
  18. #include <msp430x14x.h>
  19. #define uint      unsigned int
  20. #define uchar       unsigned char
  21. #define ADS_S       0x80    //命令起始位
  22. #define ADS_MODE    0x08    //模式选择。MODE端选择直接接高电平,此位不用设置
  23. #define ADS_S_D     0x04    //输入方式选择
  24. #define ADS_POWER   0x00    //是否允许掉电
  25. #define DIR_CS      P3DIR|=BIT0
  26. #define ADS_CS_1    P3OUT|=BIT0
  27. #define ADS_CS_0    P3OUT&=~BIT0 //片选
  28. #define ADS_DIR_IN P3DIR|=BIT1 //端口输出模式
  29. #define ADS_DIN_1   P3OUT|=BIT1 //命令写入AD
  30. #define ADS_DIN_0   P3OUT&=~BIT1
  31. #define ADS_DIR_OT P2DIR&=~BIT0 //端口为输入模式
  32. #define ADS_CLK_DIR P4DIR|=BIT4 //端口为输出模式
  33. #define ADS_CLK_1   P4OUT|=BIT4 //时钟置1
  34. #define ADS_CLK_0   P4OUT&=~BIT4 //时钟置0
  35. #define DIR_BUSY    P4DIR&=~BIT0
  36. //#define DATA_IN     ((P4IN>>2 & 0x01)
  37. #define DATA_IN     (P2IN & 0x01)
  38. #define BUSY_IN     (P4IN & 0x01) //读输入数据
  39. void Check_busy(void);
  40. void SPI_WR(uchar DATA);
  41. void Init_Port(void);
  42. void delay(uint temp);
  43. uint ADS7841_Read_Data(uchar Channel);
  44. uint temp_DATA[100];
  45. void delay(uint temp1)
  46. {
  47. int i;
  48. for(i=temp1;i>0;i--)
  49. {
  50.     ;
  51. }
  52. }
  53. uint ADS7841_Read_Data(uchar Channel) //Channel=0:CH0;1:CH1;2:CH2;3:CH3;
  54. {
  55. uint ADCResult=0;
  56. uchar i,ADS_CHANNEL;
  57. uint TempBit =0;
  58. uchar COMMAND=0;
  59. switch (Channel)
  60. {
  61.      case 0:ADS_CHANNEL=0x10;break; //通道选择
  62.      case 1:ADS_CHANNEL=0x50;break;
  63.      case 2:ADS_CHANNEL=0x20;break;
  64.      case 3:ADS_CHANNEL=0x60;break;
  65.      default:ADS_CHANNEL=0x10;break;        
  66. }
  67. COMMAND=(ADS_S|ADS_CHANNEL|ADS_S_D|ADS_POWER);
  68. ADS_CLK_0;
  69. ADS_DIN_0;     ///DIN先置0
  70. ADS_CS_0; //;片选信号
  71. //SPI_WR(COMMAND);                //SPI总线写命令子程序
  72. //ADS_DIR_IN;              //端口定义为输出模式,上升沿发送,下降沿接受
  73. for(i=0;i<8;i++)
  74. {
  75.      ADS_CLK_1;
  76.      if( (COMMAND & 0x80) ==0x80)
  77.      {
  78.         ADS_DIN_1;        //写入指令
  79.      }
  80.      else
  81.      {
  82.         ADS_DIN_0;
  83.      }
  84.      COMMAND<<=1;                   //左移
  85.      delay(5);
  86.      ADS_CLK_0;
  87.      delay(5);                  //模拟SPI串行接口 发送数据                     
  88. }
  89. delay(5);
  90. ADS_CLK_0;
  91. Check_busy();
  92. //delay(5);
  93. for(i=0;i<12;i++)
  94. {                              //上升沿读出数据   
  95.      ADS_CLK_0;
  96.      delay(4);
  97.     if( DATA_IN==0x01 )
  98.      {
  99.        TempBit=1;
  100.      }
  101.      else
  102.      {
  103.        TempBit=0;
  104.      }
  105.     ADS_CLK_1;
  106.     ADCResult=((ADCResult<<1)|TempBit);    //模拟SPI串行接口,接收数据
  107.     delay(5);
  108. }
  109.     ADS_CLK_0;
  110. for(i=0;i<4;i++)
  111. {
  112.      ADS_CLK_1;
  113.      delay(5);
  114.      ADS_CLK_0;
  115.      delay(5);
  116. }
  117. ADS_CS_1;                      //屏蔽片选
  118. return ADCResult;
  119. }
  120. void Check_busy(void)
  121. {
  122. int temp;
  123. //DIR_BUSY;                     //端口设置为输入方式
  124. ADS_CLK_1;
  125. temp=BUSY_IN;
  126. ADS_CLK_0;
  127. while( (temp&0x01)==0)   //检测到高电平就开始读数。。不然会丢一位
  128. {
  129.     ADS_CLK_1;              //读端口状态....
  130.     temp=BUSY_IN;
  131.     //delay(5);                 //
  132.     ADS_CLK_0;
  133. }
  134. //
  135. /* do
  136. {
  137.       ADS_CLK_0;               //读端口状态....
  138.       temp=BUSY_IN;
  139.       delay(5);                 //
  140.       ADS_CLK_1;
  141. }while((temp&0x01)!=0);      //高位为1为忙信号*/
  142. }
  143. void SPI_WR(uchar DATA)
  144. {
  145. uint i;
  146. ADS_DIR_IN;              //端口定义为输出模式,上升沿发送,下降沿接受
  147. for(i=0;i<8;i++)
  148. {
  149.      ADS_CLK_1;
  150.      if( (DATA & 0x80) ==0x80)
  151.      {
  152.         ADS_DIN_1;        //写入指令
  153.      }
  154.      else
  155.      {
  156.         ADS_DIN_0;
  157.      }
  158.      DATA<<=1;                   //左移
  159.      ADS_CLK_0;
  160.      delay(5);                  //模拟SPI串行接口 发送数据                     
  161. }
  162. delay(5);
  163. ADS_CLK_0;
  164. }
  165. void Init_Port(void)
  166. {
  167. P3SEL=0X00;
  168. P4SEL=0X00;
  169. ADS_DIR_IN;
  170. ADS_DIR_OT;
  171. ADS_CLK_DIR;
  172. DIR_BUSY;
  173. DIR_CS;
  174. ADS_CLK_0;
  175. //delay(5);
  176. ADS_CS_1;
  177. // ADS_CLK_1;
  178. }
  179. void main(void)
  180. {
  181. WDTCTL = WDTPW+WDTHOLD; //关看门狗
  182. Init_Port();            //端口初始化
  183. uint flag=0;
  184. uint i;
  185. while(1)
  186. {
  187.     for(i=0;i<5;i++)
  188.     {
  189.       temp_DATA[i]=ADS7841_Read_Data(0);
  190.       delay(10);
  191.     }
  192.     flag=1;
  193. }

  194. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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