搜索
bottom↓
回复: 4

如何读取ADS8332的值,求指导!

[复制链接]

出0入0汤圆

发表于 2012-4-24 13:54:32 | 显示全部楼层 |阅读模式
最近用到TI的8通道16位高速ADC,调试两天没成功,求高人贴上程序!!

出0入0汤圆

 楼主| 发表于 2012-4-24 21:36:14 | 显示全部楼层
我是用MSP430F149模拟SPI写的!没调出来,烦呀!

出0入0汤圆

发表于 2013-8-15 20:10:57 | 显示全部楼层
楼主,成功了吗?数据手册看了看,还是不知道怎么往里面写配置信息和读数据!!!!!!!!!!!!!!!!

出0入10汤圆

发表于 2013-11-12 13:02:23 | 显示全部楼层
你的程序贴出来?

出0入0汤圆

发表于 2013-11-19 14:29:03 | 显示全部楼层
yongke 发表于 2013-11-12 13:02
你的程序贴出来?

这是很久以前写的 可以参考参考
  1. #include "msp430.h"
  2. /***************************************************************************
  3. //IO口操作宏定
  4. ****************************************************************************/
  5. #define SET 1
  6. #define RESET 0
  7. #define _ADD_STR(a, b)              a##b
  8. #define ADD_STR(a, b)               _ADD_STR(a, b)
  9. #define _IO_PORT_IN(PORT)           (PORT##IN)
  10. #define GPIO_READ_BITS(PORT, BIT)   ( (_IO_PORT_IN(PORT) & BIT) ? (SET):(RESET))
  11. #define GOIO_READ_PORTS(PORT)       ( _IO_PORT_IN(PORT) )
  12. #define _IO_PORT_OUT(PORT)          (PORT##OUT)
  13. #define GPIO_SET_BITS(PORT, BIT)    ( ( _IO_PORT_OUT(PORT) ) |= (BIT) )
  14. #define GPIO_RESET_BITS(PORT, BIT)  ( ( _IO_PORT_OUT(PORT) ) &= ~(BIT) )
  15. #define _IO_PORT_DIR(PORT)          (PORT##DIR)
  16. #define GPIO_OUTPUT_DIR(PORT, BIT)  ( ( _IO_PORT_DIR(PORT) ) |= (BIT) )
  17. #define GPIO_INPUT_DIR(PORT, BIT)   ( ( _IO_PORT_DIR(PORT) ) &= ~(BIT) )
  18. #define _IO_PORT_IE(PORT)           (PORT##IE)
  19. #define GPIO_ENABLE_IRQ(PORT, BIT)  ( ( _IO_PORT_IE(PORT) ) |= (BIT) )
  20. #define GPIO_DISABLE_IRQ(PORT, BIT) ( ( _IO_PORT_IE(PORT) ) &= ~(BIT) )
  21. #define _IO_PORT_SEL(PORT)          (PORT##SEL)
  22. #define GPIO_PORT_FUNC(PORT, BIT)   ( ( _IO_PORT_SEL(PORT) ) |= (BIT) )
  23. #define GPIO_MULTI_FUNC(PORT, BIT)  ( ( _IO_PORT_SEL(PORT) ) &= ~(BIT) )
  24. #define TEST_BIT(x)  ( GPIO_READ_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
  25. #define SET_BIT(x)   ( GPIO_SET_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
  26. #define CLR_BIT(x)   ( GPIO_RESET_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
  27. #define BIT_OUT(x)   ( GPIO_OUTPUT_DIR( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
  28. #define BIT_IN(x)    ( GPIO_INPUT_DIR( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
  29. #define EINT_BIT(x)  ( GPIO_ENABLE_IRQ( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
  30. #define DINT_BIT(x)  ( GPIO_DISABLE_IRQ( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
  31. /***************************************************************************
  32. //命令寄存器 (CMR)
  33. ****************************************************************************/
  34. #define Channel_0    0x0000//Select analog input channel 0
  35. #define Channel_1    0x1000//Select analog input channel 1
  36. #define Channel_2    0x2000//Select analog input channel 2
  37. #define Channel_3    0x3000//Select analog input channel 3
  38. #define Channel_4    0x4000//Select analog input channel 4
  39. #define Channel_5    0x5000//Select analog input channel 5
  40. #define Channel_6    0x6000//Select analog input channel 6
  41. #define Channel_7    0x7000//Select analog input channel 7
  42. #define WAKE_UP      0xB000//Wake up
  43. #define READ_CFR     0xC000//Read CFR
  44. #define READ_DATA    0xD000//Read data
  45. #define WRITE_CFR    0xE000//Write CFR
  46. #define DEFAULT_CFR  0xF000//Default mode
  47. /***************************************************************************
  48. //配置寄存器 (CFR)
  49. ****************************************************************************/
  50. #define AUTO_CHAN        0x0800//Channel select mode
  51. #define CCLK_INT         0x0400//Conversion clock (CCLK) source select
  52. #define MAN_TRG          0x0200//Trigger (conversion start) select
  53. #define SAT              0x0100//Sample rate for Auto-Trigger moden
  54. #define POL_INT_EOC_LOW  0x0080//Pin 10 polarity select when used as an
  55. #define PIN10_EOC        0x0040//Pin 10 polarity select when used as an
  56. #define PIN10_OUTPUT     0x0020//Pin 10 I/O select for daisy-chain mode operation
  57. #define ANAP_DISABLE     0x0010//Auto-Nap Power-Down enable/disable
  58. #define RESUME_NAP       0x0008//Nap Power-Down.
  59. #define RESUME_DEEP      0x0004//Deep Power-Down
  60. #define TAG              0x0002//TAG bit output enable
  61. #define NO_RESET         0x0001//Software reset
  62. //LCD 常用指令
  63. #define SYSDIS             0x00// 关振系统荡器和LCD偏压发生器
  64. #define SYSEN              0x01// 打开系统振荡器
  65. #define LCDOFF             0x02// 关LCD偏压
  66. #define LCDON              0x03// 打开LCD偏压
  67. #define BIASCOM            0x29// 1/3 偏置 4 位公共端
  68. /***************************************************************************
  69. //IO扣定义
  70. ****************************************************************************/
  71. #define NSS_PORT       P2
  72. #define NSS_BIT        BIT0
  73. #define SCLK_PORT      P2
  74. #define SCLK_BIT       BIT5
  75. #define MISO_PORT      P2
  76. #define MISO_BIT       BIT3
  77. #define MOSI_PORT      P1
  78. #define MOSI_BIT       BIT6
  79. #define RST_PORT       P2
  80. #define RST_BIT        BIT1
  81. #define CONV_PORT      P2
  82. #define CONV_BIT       BIT2
  83. #define INT_PORT       P1
  84. #define INT_BIT        BIT3

  85. /*****************************************************************
  86. 管脚分配 CS P1.0 WR P1.1 DAT P1.2
  87. *****************************************************************/
  88. #define LCD_CS_PORT    P2    //LCD使能引脚
  89. #define LCD_CS_BIT     BIT4  //LCD使能引脚
  90. #define LCD_WR_PORT    P2    //LCD时钟引脚
  91. #define LCD_WR_BIT     BIT5  //LCD时钟引脚
  92. #define LCD_Data_PORT  P2    //LCD数据引脚
  93. #define LCD_Data_BIT   BIT3  //LCD数据引脚

  94. float Voltage=0.0;
  95. unsigned char  DIS_BUF[7];//显示缓冲区
  96. //段码解码表                            0    1    2    3    4    5    6    7    8    9    -    E    R   空
  97. const    unsigned char      DIS[] = {0xD7,0x06,0xE3,0xA7,0x36,0xB5,0xF5,0x07,0xF7,0xB7,0x20,0xF1,0x51,0x00};
  98. /****************************************************************************
  99. * 名    称:void ADS8332_IO_INT(void)
  100. * 功    能:ADS8332驱动IO口初始化
  101. * 入口参数:无
  102. * 出口参数:无
  103. * 说    明:
  104. * 调用方法:ADS8332_IO_INT();
  105. ****************************************************************************/
  106. void ADS8332_IO_INT(void)
  107. {
  108.   BIT_OUT(NSS);
  109.   SET_BIT(NSS);
  110.   BIT_OUT(SCLK);
  111.   CLR_BIT(SCLK);//常态为低电平
  112.   BIT_OUT(MOSI);
  113.   SET_BIT(MOSI);
  114.   BIT_OUT(RST);
  115.   SET_BIT(RST);
  116.   BIT_OUT(CONV);
  117.   SET_BIT(CONV);
  118.   BIT_IN(INT);
  119.   BIT_IN(MISO);
  120. }
  121. /****************************************************************************
  122. * 名    称:void Delay(unsigned int n)
  123. * 功    能:通用延时
  124. * 入口参数:无
  125. * 出口参数:无
  126. * 说    明:
  127. * 调用方法:Delay(1000);
  128. ****************************************************************************/
  129. void Delay(unsigned int n)
  130. {
  131.   for(;n>0;n--);
  132. }
  133. /*
  134. *********************************************************************************************************
  135. *                                                Write_LCD_Byte()
  136. * Description : 向 LCD 写一字节
  137. *
  138. * Arguments   : Data 数据 Length 数据长度
  139. *
  140. * Returns     :
  141. *********************************************************************************************************
  142. */
  143. void Write_LCD_Byte(unsigned char Data,unsigned char Length)
  144. {
  145.   unsigned char i,Temp=0x80;
  146.   for (i=0;i<Length;i++)
  147.   {
  148.     CLR_BIT(LCD_WR);    //“写”时钟置0
  149.     if (Data&Temp)
  150.     SET_BIT(LCD_Data);  //数据线置1
  151.     else
  152.     CLR_BIT(LCD_Data);  //数据线置0
  153.     Temp>>=1;       //准备下一位
  154.     SET_BIT(LCD_WR);     //“写”时钟置1
  155.     Delay(100);    //等待完成
  156.   }
  157.   SET_BIT(LCD_Data);     //数据线置高 可减少IO口漏电流损耗
  158. }
  159. /*
  160. *********************************************************************************************************
  161. *                                                Write_LCD_Data()
  162. * Description : 向 LCD 写数据
  163. *
  164. * Arguments   : Address 写数据地址  Data 数据
  165. *
  166. * Returns     :
  167. *********************************************************************************************************
  168. */
  169. void Write_LCD_Data(unsigned char Address,unsigned char Data)
  170. {
  171.   CLR_BIT(LCD_CS);               //片选置0
  172.   Write_LCD_Byte(0xA0,3);   //写入写数据的ID 101 高3位有效
  173.   Write_LCD_Byte(Address,6);//写入6个位初始地址 高6位有效
  174.   Write_LCD_Byte(Data,4);   //写入4个位数据 高4位有效
  175.   SET_BIT(LCD_CS);               //片选置1  
  176. }
  177. /*
  178. *********************************************************************************************************
  179. *                                                Write_LCD_Command()
  180. * Description : 向 LCD 写命令
  181. *
  182. * Arguments   : Command 命令
  183. *
  184. * Returns     :
  185. *********************************************************************************************************
  186. */
  187. void Write_LCD_Command(unsigned char Command)
  188. {
  189.     CLR_BIT(LCD_CS);                //片选置0
  190.     Write_LCD_Byte(0x80,3);    //写入命令的ID:100
  191.     Write_LCD_Byte(Command,8); //写入实际命令的高8位(CMD.):C8-C1
  192.     SET_BIT(LCD_Data);              //|写入一个“1”即手册上所指“无关位”的那一个数据位
  193.     CLR_BIT(LCD_WR);                //|
  194.     Delay(100);                  //|
  195.     SET_BIT(LCD_WR);                //|
  196.     SET_BIT(LCD_CS);                //片选置1
  197. }
  198. /*
  199. *********************************************************************************************************
  200. *                                                DisCharacter()
  201. * Description : 显示字符函数
  202. *
  203. * Arguments   : *Data显示内容指针 Address 显示首位置   Length内容长度
  204. *
  205. * Returns     :
  206. *********************************************************************************************************
  207. */
  208. void DisCharacter(unsigned char *Data,unsigned char Address,unsigned char Length,unsigned char Point)
  209. {
  210.   unsigned char i,Temp;
  211.   for(i=0;i<Length;i++)
  212.   {
  213.     Temp=DIS[*Data];                       //数据解析
  214.     Write_LCD_Data((Address*8-4),Temp);    //写高4位数据
  215.     if(i==(Point-1)) Temp=Temp|0x08;       //小数点位判别
  216.     Write_LCD_Data((Address*8),Temp<<=4);//写低4位数据
  217.     Data ++;                               //显示数据指针增一
  218.     Address ++;                            //显示地址增一
  219.   }
  220. }
  221. /*
  222. *********************************************************************************************************
  223. *                                                LCD_INIT()
  224. * Description : LCD IO口、设置初始化及清屏
  225. *
  226. * Arguments   :
  227. *
  228. * Returns     :
  229. *********************************************************************************************************
  230. */
  231. void LCD_INIT( void )
  232. {
  233.   unsigned char i;
  234.   BIT_OUT ( LCD_Data );      //|IO口初始化
  235.   BIT_OUT ( LCD_CS );       //|
  236.   BIT_OUT ( LCD_WR );       //|
  237.   SET_BIT ( LCD_CS );       //|
  238.   SET_BIT ( LCD_WR );       //|
  239.   SET_BIT ( LCD_Data );     //|
  240.   Write_LCD_Command(SYSEN);  // 打开系统振荡器
  241.   Write_LCD_Command(LCDON);  // 打开LCD显示
  242.   Write_LCD_Command(BIASCOM);// 设置驱动方式
  243.   for(i=0;i<80;i++) Write_LCD_Data(i,0x00);//清屏
  244. }
  245. /*
  246. *********************************************************************************************************
  247. *                                                Displays_Decoded()
  248. * Description : 显示解码函数
  249. *
  250. * Arguments   : float DIS_Temp 待显示的数值  
  251. *
  252. * Returns     :  
  253. *********************************************************************************************************
  254. */
  255. void Displays_Decoded(float DIS_Temp)
  256. {
  257.   unsigned long Temp;
  258.   unsigned char i;
  259.   if(DIS_Temp<0)//负号判断
  260.   {
  261.     DIS_Temp=-DIS_Temp;
  262.     DIS_BUF[0]=10;//设置负号
  263.   }
  264.   else
  265.     DIS_BUF[0]=13;//清除负号
  266.   if(DIS_Temp>=10000)
  267.     i=0;
  268.   else if(DIS_Temp>=1000)
  269.   {
  270.     DIS_Temp=DIS_Temp*10;
  271.     i=5;
  272.   }
  273.   else if(DIS_Temp>=100)
  274.   {
  275.     DIS_Temp=DIS_Temp*100;
  276.     i=4;
  277.   }
  278.   else if(DIS_Temp>=10)
  279.   {
  280.     DIS_Temp=DIS_Temp*1000;
  281.     i=3;
  282.   }
  283.   else
  284.   {
  285.     DIS_Temp=DIS_Temp*10000;
  286.     i=2;
  287.   }
  288.   Temp = (unsigned long) DIS_Temp;
  289.   DIS_BUF[1]=Temp/10000;
  290.   Temp=Temp%10000;
  291.   DIS_BUF[2]=Temp/1000;
  292.   Temp=Temp%1000;
  293.   DIS_BUF[3]=Temp/100;
  294.   Temp=Temp%100;
  295.   DIS_BUF[4]=Temp/10;
  296.   Temp=Temp%10;
  297.   DIS_BUF[5]=Temp/1;
  298.   DisCharacter(DIS_BUF,0x00,0x06,i);//显示计数值
  299. }
  300. /****************************************************************************
  301. * 名    称:void ADS8332_SPI_ReadWrite(unsigned int Data)
  302. * 功    能:模拟SPI读写
  303. * 入口参数:unsigned int Data 被写入数据
  304. * 出口参数:unsigned int Temp 读出数据
  305. * 说    明:Data = ADS8332_SPI_ReadWrite(0x1234)
  306. ****************************************************************************/
  307. unsigned int ADS8332_SPI_ReadWrite(unsigned int Data)
  308. {
  309.   unsigned char i;
  310.   unsigned int Temp=0x0000;
  311.   CLR_BIT(NSS);//片选使能
  312.   for(i=0;i<16;i++)//寄存器为16Bit
  313.   {
  314.     if(Data&0x8000)
  315.       SET_BIT(MOSI);
  316.     else
  317.       CLR_BIT(MOSI);
  318.     Delay(0x08);
  319.     Temp <<= 0x01;//先读取高位
  320.     Data <<= 0x01;//先从高位传输
  321.     if(TEST_BIT(MISO))  Temp|=0x01;//片选之后 第一 Bit 就已经输出了
  322.     SET_BIT(SCLK);//下降沿有效
  323.     CLR_BIT(SCLK);//常态为低电平
  324.   }
  325.   SET_BIT(NSS);
  326.   return Temp;
  327. }
  328. /****************************************************************************
  329. * 名    称:void ADS8332_Initi(void)
  330. * 功    能:ADS8332 初始化
  331. * 入口参数:
  332. * 出口参数:
  333. * 说    明:ADS8332_Initi(void)
  334. ****************************************************************************/

  335. void ADS8332_Init(void)
  336. {
  337.   unsigned int Config=0x0000,Temp;
  338.   ADS8332_IO_INT();//IO口初始化
  339.   CLR_BIT(RST);//复位ADS8332
  340.   Delay(0xFFFF);
  341.   SET_BIT(RST);
  342.   Delay(0xFFFF);
  343.   Config |= WRITE_CFR;//配置工作模式具体见手册
  344.   Config |= CCLK_INT;
  345.   Config |= MAN_TRG;
  346.   Config |= SAT;
  347.   Config |= POL_INT_EOC_LOW;
  348.   Config |= PIN10_OUTPUT;
  349.   Config |= ANAP_DISABLE;
  350.   Config |= RESUME_NAP;
  351.   Config |= RESUME_DEEP;
  352.   Config |= NO_RESET;
  353.   ADS8332_SPI_ReadWrite(Config);//写配置寄存器
  354.   Delay(0xFFFF);Delay(0xFFFF);Delay(0xFFFF);
  355.   Temp = ADS8332_SPI_ReadWrite(READ_CFR);//读配置寄存器
  356.   while(!((Temp&0x0FFF)==(Config&0x0FFF)));//比较写入和读出结果 相同则通过 不同则停在此处 应加其他处理
  357. }
  358. void main( void )
  359. {
  360.   unsigned long Temp;
  361.   WDTCTL = WDTPW + WDTHOLD;
  362.   BCSCTL1 = CALBC1_8MHZ;  //Set DCO to 1, 8, 12 or 16MHz
  363.   DCOCTL  = CALDCO_8MHZ;  //如果用其他频率 相应延时要做调整
  364.   LCD_INIT();//初始化液晶屏
  365.   ADS8332_Init();//初始化 ADS8332
  366.   P1DIR |= BIT6;
  367.   for(;;)
  368.   {
  369.     ADS8332_SPI_ReadWrite(Channel_0);//选择通道0 每读一次设置一次 不然通道无效
  370.     Delay(0x0F);
  371.     CLR_BIT(CONV);//启动转换
  372.     Delay(0x0F);
  373.     SET_BIT(CONV);
  374.     Delay(0x0F);
  375.     while(TEST_BIT(INT)==1);//等待转换完成标志 应加超时判断 或者中断方式处理
  376.    
  377.     ADS8332_SPI_ReadWrite(READ_DATA);//读上一组数据 必须有不然读出数据错误
  378.     Temp=ADS8332_SPI_ReadWrite(READ_DATA);//读本次转换数据 并且累加

  379.     Voltage=Temp/65535.0*2.5;//计算电压 参考电压 2.5V
  380.    
  381.     //Voltage = (Voltage*1000.0 - 509.0) / 2.64; //VTEMP PIN = 509mV + 2.64 × T(°C) 测量 REF5025 温度输出 具体见参考手册
  382.    
  383.     Displays_Decoded(Voltage);//显示电压值
  384.     P1OUT ^= BIT6;
  385.     Delay(0xFF);
  386.   }
  387. }
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 11:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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