标题: 24bit ADC CS1237完整驱动源码,实测可用无bug,只需修改IO口定义 [打印本页]

作者: 耶耶宁    时间: 2018-8-24 11:34
标题: 24bit ADC CS1237完整驱动源码,实测可用无bug,只需修改IO口定义
24bit ADC芯片 CS1237完整驱动,实测可用无bug,只需修改IO口定义、移植IO口拉高拉低函数、定时器函数即可使用,简单方便快捷。


单片机源程序如下:
  1. /*****************************************
  2. *        CS1237 designed by Robert Lee           *
  3. *                                        *
  4. *****************************************/
  5. #include "bsp.h"
  6. #include "common.h"

  7. //#ifdef USER_CS1237  
  8. #define ADC_Bit  24 //ADC有效位数,带符号位 最高24位
  9. #define SCK_1  SetGpio(10, 0)
  10. #define SCK_0  ClearGpio(10, 0)
  11. #define DAT_1  SetGpio(10, 1)
  12. #define DAT_0  ClearGpio(10, 1)
  13. #define        NOP_5()                __asm {nop};__asm {nop};__asm {nop}
  14. #define        NOP30()                NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();
  15. #define        NOP40()                NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();
  16. #define One_CLK  SCK_1;NOP40();SCK_0;NOP40();
  17. #define CS_CON  0X00   //芯片地配置 内部REF 输出10HZ PGA=1 通道A 0X00  
  18. #define Lv_Bo 0.01  //滤波系数 小于1

  19. //sbit DOUT = P3^7;//数据对应IO口
  20. //sbit SCLK = P3^5;//时钟对应IO口
  21. static long AD_Res_Last=0;//上一轮的ADC数值保存

  22. //延时500US 5.5296MHZ
  23. void delay_500us(volatile unsigned char a)
  24. {        
  25.         volatile unsigned char i,j,b;
  26.         for(b=0;b<a;b++)
  27.         {
  28.                 i = 3;
  29.                 j = 137;
  30.                 do
  31.                 {
  32.                         while (--j);
  33.                 } while (--i);
  34.         }
  35. }
  36. //CS1237进入低功耗模式
  37. void CS1237_Power_Down(void)
  38. {
  39.         //SCLK = 1;
  40.         SCK_1;
  41.         delay_500us(100);
  42.         //SCLK = 1;
  43.         SCK_1;
  44.         //SCLK = 1;
  45.         SCK_1;
  46.         delay_500us(100);
  47. }
  48. //配置CS1237芯片
  49. void Con_CS1237(void)
  50. {
  51.         unsigned char i;
  52.         unsigned char dat;
  53.         unsigned short count_i=0;//溢出计时器

  54.         SetPinMux(10, 0, 0);//SCK
  55.         SetPinMux(10, 1, 0);//SDA

  56.         SetPinDir(10,0,1);
  57.         SetPinDir(10,1,0);
  58.         
  59.         dat = CS_CON;// 0100 1000
  60.         SCK_0;//时钟拉低
  61.         while(ReadGpio(10,1) ==1)//芯片准备好数据输出  时钟已经为0,数据也需要等CS1237全部拉低为0才算都准备好
  62.         {
  63.                 delay_500us(10);
  64.                 count_i++;
  65.                 if(count_i > 15000)
  66.                 {
  67.                         SCK_1;
  68.                         DAT_1;
  69.                         printf("here error\r\n");
  70.                         return;//超时,则直接退出程序
  71.                 }
  72.         }
  73.         for(i=0;i<29;i++)// 1 - 29
  74.         {
  75.                 One_CLK;
  76.         }
  77.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//30
  78.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//31
  79.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//32
  80.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//33
  81.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//34
  82.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//35
  83.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//36
  84.         One_CLK;//37     写入了0x65
  85.         for(i=0;i<8;i++)// 38 - 45个脉冲了,写8位数据
  86.         {
  87.                 SCK_1;NOP40();
  88.                 if(dat&0x80)
  89.                         DAT_1;
  90.                 else
  91.                         DAT_0;
  92.                 dat <<= 1;
  93.                 SCK_0;NOP40();
  94.         }
  95.         One_CLK;//46个脉冲拉高数据引脚
  96. }
  97. //读取芯片的配置数据
  98. unsigned char Read_CON(void)
  99. {
  100.         unsigned char i;
  101.         unsigned char dat=0;//读取到的数据
  102.         unsigned short count_i=0;//溢出计时器
  103.         unsigned char k=0,j=0;//中间变量
  104.         SCK_0;//时钟拉低
  105.         while(ReadGpio(10,1) ==1)//芯片准备好数据输出  时钟已经为0,数据也需要等CS1237全部拉低为0才算都准备好
  106.         {
  107.                 delay_500us(10);
  108.                 count_i++;
  109.                 if(count_i > 15000)
  110.                 {
  111.                         SCK_1;
  112.                         DAT_1;
  113.                         printf("here outtime error\r\n");
  114.                         return 1;//超时,则直接退出程序
  115.                 }
  116.         }
  117.         for(i=0;i<29;i++)// 1 - 29
  118.         {
  119.                 One_CLK;
  120.         }
  121.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//30
  122.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//31
  123.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//32
  124.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//33
  125.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//34
  126.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//35
  127.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//36
  128.         DAT_1;
  129.         One_CLK;//37     写入了0x56
  130.         dat=0;
  131.         for(i=0;i<8;i++)// 38 - 45个脉冲了,读取数据
  132.         {
  133.                 One_CLK;
  134.                 dat <<= 1;
  135.                 if(ReadGpio(10,1) ==1)
  136.                         dat++;
  137.         }
  138.         One_CLK;//46个脉冲拉高数据引脚
  139.         return dat;
  140. }
  141. //读取ADC数据,返回的是一个有符号数据
  142. long Read_CS1237(void)
  143. {
  144.         unsigned char i;
  145.         long dat=0;//读取到的数据
  146.         unsigned char count_i=0;//溢出计时器
  147. //        DOUT = 1;//端口锁存1,51必备
  148.         SCK_0;//时钟拉低
  149.         while(ReadGpio(10,1) ==1)//芯片准备好数据输出  时钟已经为0,数据也需要等CS1237拉低为0才算都准备好
  150.         {
  151.                 delay_500us(10);
  152.                 count_i++;
  153.                 if(count_i > 300)
  154.                 {
  155.                         SCK_1;
  156.                         DAT_1;
  157.                         printf("Read_CS1237 outtime error\r\n");
  158.                         return 0;//超时,则直接退出程序
  159.                 }
  160.         }
  161. //        DOUT = 1;//端口锁存1,51必备
  162.         dat=0;
  163.         for(i=0;i<24;i++)//获取24位有效转换
  164.         {
  165.                 SCK_1;
  166.                 NOP40();
  167.                 dat <<= 1;
  168.                 if(ReadGpio(10,1) ==1)
  169.                         dat ++;
  170.                 SCK_0;
  171.                 NOP40();        
  172.         }
  173.         for(i=0;i<3;i++)//一共输入27个脉冲
  174.         {
  175.                 One_CLK;
  176.         }
  177.         //DAT_1;
  178.         //先根据宏定义里面的有效位,丢弃一些数据
  179.         i = 24 - ADC_Bit;//i表示将要丢弃的位数
  180.         dat >>= i;//丢弃多余的位数
  181.         return dat;
  182. }
  183. //初始化ADC相关参数
  184. void Init_CS1237(void)
  185. {
  186.         Con_CS1237();//配置CS1237
  187.         if(Read_CON() != CS_CON)//如果读取的ADC配置出错,则重启
  188.         {
  189.                 printf("Init_CS1237 error\r\n");
  190.         }
  191.                 //IAP_CONTR = 0x20;
  192.         //AD_Res_Last = Read_CS1237();
  193.         //AD_Res_Last = Read_CS1237();
  194.         //AD_Res_Last = Read_CS1237();
  195.         //printf("AD_Res_Last 0x%x\r\n",AD_Res_Last);
  196. }
  197. //数字一阶滤波器 滤波系数A,小于1。上一次数值B,本次数值C out = b*A + C*(1-A)
  198. //下面这个程序负责读取出最终ADC数据
  199. long Read_12Bit_AD(void)
  200. {
  201.         float out,c;
  202.         
  203.         out = AD_Res_Last;
  204.         c = Read_CS1237();
  205.         if(out !=0 && (out<c*0.8 || out>c*1.2))
  206.           c = out;
  207.         if(c!=0) // 读到正确数据
  208.         {
  209.                 out = out*Lv_Bo + c*(1-Lv_Bo);
  210.                 AD_Res_Last = out;//把这次的计算结果放到全局变量里面保护
  211.         }
  212.         //printf("AD_Res_Last 0x%x\r\n",AD_Res_Last);
  213.         return AD_Res_Last;
  214. }
  215. //#endif
复制代码

所有资料51hei提供下载:
cs1237驱动.rar (2.25 KB, 下载次数: 744)



作者: xuanmic    时间: 2019-2-22 15:53
谢谢楼主的分享!
作者: ak5136728    时间: 2019-4-10 10:38
谢谢楼主分享资料
作者: abczhouhao123    时间: 2019-5-6 10:32
参考一下
作者: irisice008    时间: 2019-5-17 21:04
谢谢分享资料
作者: 284183304    时间: 2019-6-11 23:07

谢谢楼主分享资料
作者: yaozhonlei    时间: 2019-6-13 00:28
谢谢楼主分享资料!
作者: gxw8051    时间: 2019-8-28 10:27
太好了 就是不知道怎么样
作者: huanqing    时间: 2019-9-25 10:07
bsp.h是什么文件?可以提供一下吗?
作者: huanqing    时间: 2019-9-25 10:15
SetPinMux  SetPinDir  都是什么操作?
作者: pmsjzj    时间: 2019-9-28 13:53
感谢分享。。。。
作者: pmsjzj    时间: 2019-9-28 14:02
bsp.h 什么函数???
作者: huanqing    时间: 2019-9-30 09:10
这个还是没用
作者: 海嵌    时间: 2019-10-15 17:01
牛逼学习了
作者: cd68001    时间: 2019-11-11 21:44
十分感谢!!!!
作者: pengyongnet    时间: 2019-11-17 18:28
大哥不行我的stc89c52r
作者: darvu    时间: 2019-12-10 22:03
谢谢分享,正找着
作者: xoyo521    时间: 2020-2-28 20:45
正需要,谢谢
作者: 後生仔,拼搏    时间: 2020-3-10 14:03
正好需要,谢谢分享,祝好运。
作者: yijianshechuan    时间: 2020-4-13 14:13
谢谢楼主分享
作者: 芝麻    时间: 2020-4-13 17:43
mark一下
作者: 一江春水一号    时间: 2020-5-5 17:18
有测试过的朋友吗?能用不?
作者: 一江春水一号    时间: 2020-5-5 17:18
有测试过的朋友吗?能用不?
作者: 一江春水一号    时间: 2020-5-5 17:41
有测试过的朋友吗?可以用不?

作者: 嗷嗷叫的老马    时间: 2020-10-26 11:29
谢谢分享,正需要,省很多工夫了,下载来看看。
作者: 柠檬双生    时间: 2020-11-26 10:44
有32HAI库的吗?
作者: wskfengliu    时间: 2021-4-4 22:40
感谢分享,请问 NOP_5() 是什么意思?延时5个指令周期吗?
作者: luhuimin    时间: 2021-7-16 11:21
SetPinMux, SetPinDir 这2个函数,谁能看懂?
作者: wylyhz999    时间: 2021-7-18 12:03
感谢楼主分享,很强大,收藏起来
作者: ccnnzz315    时间: 2021-10-10 20:53
一江春水一号 发表于 2020-5-5 17:18
有测试过的朋友吗?能用不?

我初步测了一下,可以的,就是程序有地方,要改一下,改成自己使用的芯片
作者: ccnnzz315    时间: 2021-10-10 20:56
luhuimin 发表于 2021-7-16 11:21
SetPinMux, SetPinDir 这2个函数,谁能看懂?

这2函数,不用管它,我把它注销了,在初始化时,设置好输入,输出口子
作者: 蔡国啸    时间: 2021-11-10 10:48
ccnnzz315 发表于 2021-10-10 20:56
这2函数,不用管它,我把它注销了,在初始化时,设置好输入,输出口子

请问一下这个程序用的是模拟SPI吧,如果想接硬件SPI要怎么接,CS1237的DI/DO引脚分开接到MOSI和MISO吗
作者: aktuan007    时间: 2021-11-11 22:02
有人测试过吗
作者: gao687    时间: 2022-8-29 22:13
测试没问题,谢谢
作者: gao687    时间: 2022-8-29 22:13
可以用
作者: yxflj    时间: 2022-10-12 13:32
多谢,希望有用
作者: yxflj    时间: 2022-10-13 08:24
请问SetGpio(10, 0),ClearGpio(10, 0),SetGpio(10, 0),ClearGpio(10, 1)是对应什么,10表示什么
作者: 329410483    时间: 2023-11-15 00:22

请问SetGpio(10, 0),ClearGpio(10, 0),SetGpio(10, 0),ClearGpio(10, 1)是对应什么,10表示什么
作者: Yohnson    时间: 2024-1-24 10:46
很好的资料参考,感谢分享
作者: kinseykwok    时间: 2025-6-13 19:20
请问楼主, 我们在long Read_CS1237(void) 函数里面发生卡死的现象, (代码只更改了SCLK & DOUT)




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1