找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32 CS1237库函数程序分享

  [复制链接]
跳转到指定楼层
楼主
ID:819974 发表于 2020-12-2 13:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "stm32f10x.h"
  2. #include "uart.h"
  3. #include "cs1237.h"



  4. // 程序运行在STM32F103系列 主频72MHz
  5. // CS1237程序要注意的两个时序问题:
  6. // 1.CLK拉低以后 要等待300ms OUT引脚才会自动变低
  7. // 2.CLK的时钟频率最大是1.1Mhz 所以CLK=1和CLK=0之间 要加入至少0.5us的延时

  8. /**
  9.   * @brief  Main program.
  10.   * @param  None
  11.   * @retval None
  12.   */
  13. int main(void)
  14. {
  15.         int32_t temp;
  16.         
  17.         USART1_Init(); // 初始化串口1 波特率9600
  18.         CS1237_Init_JX();
  19.         delay_ms(300);
  20.         CS1237_Config();
  21.         delay_ms(100);
  22.         USART1_Send_byte(Read_Config());
  23.         
  24.   while (1)
  25.   {
  26.                 delay_ms(1000);
  27.                 temp = Read_CS1237();//读取CS1237的数据
  28.                 printf("%d\r\n", temp);// 把读取到的数据发送到串口
  29.   }
  30. }
复制代码
  1. #include "cs1237.h"
  2. #include "uart.h"



  3. //OUT引脚输入输出 方向设置  PA3
  4. #define OUT_IN()  {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8<<12;}
  5. #define OUT_OUT() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3<<12;}

  6. // PA2-----CLK
  7. // PA3-----OUT

  8. void Delay1us(void)
  9. {
  10.         __IO uint32_t t=5;
  11.         
  12.         while(t--);
  13. }

  14. void Delay1ms(void)
  15. {
  16.         __IO uint32_t t=8000;
  17.         
  18.         while(t--);
  19. }

  20. void delay_ms(__IO uint16_t ms)
  21. {
  22.         do{
  23.                 Delay1ms();
  24.         }while(ms--);
  25. }

  26. // 初始化PA2 PA3
  27. // PA2-----CLK
  28. // PA3-----OUT
  29. void CS1237_Init_JX(void)
  30. {        
  31.         GPIO_InitTypeDef  GPIO_InitStructure;                                       
  32.         
  33.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        
  34.         
  35.         // PA2 ----- CLK  设置为输出
  36.         // PA3 ----- OUT  设置为输出
  37.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;               
  38.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
  39.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
  40.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  41.                
  42.         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK拉高
  43.         GPIO_SetBits(GPIOA, GPIO_Pin_3);        // OUT拉高
  44. }

  45. //配置CS1237芯片
  46. void CS1237_Config(void)
  47. {
  48.         unsigned char i;
  49.         unsigned char dat;
  50.         unsigned int count_i=0;//溢出计时器
  51.         
  52.         dat = 0X0C;   //芯片地配置 内部REF 输出40HZ PGA=128 通道A 0X1C   
  53.         OUT_OUT();
  54.         GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
  55.         OUT_IN();
  56.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);// 时钟拉低
  57.         while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1) //等待CS237准备好
  58.         {
  59.                 delay_ms(1);
  60.                 count_i++;
  61.                 if(count_i > 300)
  62.                 {
  63.                         OUT_OUT();
  64.                         GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT引脚拉高
  65.                         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK引脚拉高
  66.                         return;//超时,则直接退出程序
  67.                 }
  68.         }
  69.         for(i=0;i<29;i++)// 1 - 29
  70.         {
  71.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  72.                 Delay1us();
  73.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  74.                 Delay1us();
  75.         }
  76.         OUT_OUT();
  77.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//30
  78.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//31
  79.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//32
  80.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//33
  81.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//34
  82.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//35
  83.         GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//36
  84.         //37     写入了0x65
  85.         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  86.         Delay1us();
  87.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  88.         Delay1us();
  89.         
  90.         for(i=0;i<8;i++)// 38 - 45个脉冲了,写8位数据
  91.         {
  92.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  93.                 Delay1us();
  94.                 if(dat&0x80)
  95.                         GPIO_SetBits(GPIOA, GPIO_Pin_3);// OUT = 1
  96.                 else
  97.                         GPIO_ResetBits(GPIOA, GPIO_Pin_3);
  98.                 dat <<= 1;
  99.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  100.                 Delay1us();
  101.         }
  102.         GPIO_SetBits(GPIOA, GPIO_Pin_3);// OUT = 1
  103.         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  104.         Delay1us();
  105.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  106.         Delay1us();
  107. }

  108. // 读取芯片的配置数据
  109. unsigned char Read_Config(void)
  110. {
  111.         unsigned char i;
  112.         unsigned char dat=0;//读取到的数据
  113.         unsigned char count_i=0;//溢出计时器
  114. //        unsigned char k=0,j=0;//中间变量
  115.         
  116.         OUT_OUT();
  117.         GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
  118.         OUT_IN();
  119.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);//时钟拉低
  120.         while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)//等待芯片准备好数据
  121.         {
  122.                 delay_ms(1);
  123.                 count_i++;
  124.                 if(count_i > 300)
  125.                 {
  126.                         OUT_OUT();
  127.                         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  128.                         GPIO_SetBits(GPIOA, GPIO_Pin_3);        // OUT=1;
  129.                         return 1;//超时,则直接退出程序
  130.                 }
  131.         }

  132.         for(i=0;i<29;i++)// 产生第1到29个时钟
  133.         {
  134.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  135.                 Delay1us();
  136.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  137.                 Delay1us();
  138.         }
  139.         
  140.         OUT_OUT();
  141.         
  142.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  143.         Delay1us();
  144.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  145.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  146.         Delay1us();// 这是第30个时钟
  147.         
  148.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  149.         Delay1us();
  150.         GPIO_ResetBits(GPIOA, GPIO_Pin_3);
  151.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  152.         Delay1us();// 这是第31个时钟
  153.         
  154.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  155.         Delay1us();
  156.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  157.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  158.         Delay1us();//32
  159.         
  160.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  161.         Delay1us();
  162.         GPIO_ResetBits(GPIOA, GPIO_Pin_3);
  163.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  164.         Delay1us();//33
  165.         
  166.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  167.         Delay1us();
  168.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  169.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  170.         Delay1us();//34
  171.         
  172.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  173.         Delay1us();
  174.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  175.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  176.         Delay1us();//35
  177.         
  178.         GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
  179.         Delay1us();
  180.         GPIO_ResetBits(GPIOA, GPIO_Pin_3);
  181.         GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
  182.         Delay1us();//36
  183.         
  184.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  185.         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  186.         Delay1us();
  187.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  188.         Delay1us();//37     写入0x56 即读命令
  189.         
  190.         dat=0;
  191.         OUT_IN();
  192.         for(i=0;i<8;i++)// 第38 - 45个脉冲了,读取数据
  193.         {
  194.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  195.                 Delay1us();
  196.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  197.                 Delay1us();
  198.                 dat <<= 1;
  199.                 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)
  200.                         dat++;
  201.         }
  202.         
  203.         //第46个脉冲
  204.         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  205.         Delay1us();
  206.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  207.         Delay1us();
  208.         
  209.         OUT_OUT();
  210.         GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
  211.         
  212.         return dat;
  213. }

  214. //读取ADC数据,返回的是一个有符号数据
  215. int32_t Read_CS1237(void)
  216. {
  217.         unsigned char i;
  218.         uint32_t dat=0;//读取到的数据
  219.         unsigned char count_i=0;//溢出计时器
  220.         int32_t temp;
  221.         
  222.         OUT_OUT();
  223.         GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
  224.         OUT_IN();
  225.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);//时钟拉低
  226.         while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)//等待芯片准备好数据
  227.         {
  228.                 delay_ms(1);
  229.                 count_i++;
  230.                 if(count_i > 300)
  231.                 {
  232.                         OUT_OUT();
  233.                         GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  234.                         GPIO_SetBits(GPIOA, GPIO_Pin_3);        // OUT=1;
  235.                         return 1;//超时,则直接退出程序
  236.                 }
  237.         }
  238.         
  239.         dat=0;
  240.         for(i=0;i<24;i++)//获取24位有效转换
  241.         {
  242.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  243.                 Delay1us();
  244.                 dat <<= 1;
  245.                 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)
  246.                         dat ++;
  247.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  248.                 Delay1us();
  249.         }
  250.         
  251.         for(i=0;i<3;i++)//接着前面的时钟 再来3个时钟
  252.         {
  253.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);        // CLK=1;
  254.                 Delay1us();
  255.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);        // CLK=0;
  256.                 Delay1us();
  257.         }
  258.         
  259.         OUT_OUT();
  260.         GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT = 1;
  261.         
  262.         if(dat&0x00800000)// 判断是负数 最高位24位是符号位
  263.         {
  264.                 temp=-(((~dat)&0x007FFFFF) + 1);// 补码变源码
  265.         }
  266.         else
  267.                 temp=dat; // 正数的补码就是源码
  268.         
  269.         return temp;
  270. }
复制代码


STM32-CS1237.7z

177.74 KB, 下载次数: 151, 下载积分: 黑币 -5

评分

参与人数 2黑币 +80 收起 理由
咸鱼头 + 30 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:817309 发表于 2021-3-18 13:07 | 只看该作者
有用,感谢楼主
回复

使用道具 举报

板凳
ID:900714 发表于 2021-4-5 10:13 | 只看该作者
1、读取芯片的配置数据,这个函数其实是可以不用调用的是吧?
2、您这个被测试信号很小?要不然增益怎么设定为128?如果我测试的信号为1-5V,基准源为5V,是否在这基础上设为1就可以了?有其它需要改动的吗?
回复

使用道具 举报

地板
ID:900714 发表于 2021-4-5 10:22 | 只看该作者
接上贴:
3、这个代码测试可用吗?在int32_t Read_CS1237(void)中,                if(count_i > 300)这个判断总是为假,进不了时钟和数据IO操作代码。因为count_i是8位的unsigned char,计数不可能超过256呀。

盼回复。感谢 分享
回复

使用道具 举报

5#
ID:819974 发表于 2021-7-15 02:32 | 只看该作者
wskfengliu 发表于 2021-4-5 10:22
接上贴:
3、这个代码测试可用吗?在int32_t Read_CS1237(void)中,                if(count_i > 300)这个判断总是为假 ...

就直接初始化IO口,然后在调用读取函数,用个变量去存取
回复

使用道具 举报

6#
ID:819974 发表于 2021-7-22 17:00 | 只看该作者
wskfengliu 发表于 2021-4-5 10:22
接上贴:
3、这个代码测试可用吗?在int32_t Read_CS1237(void)中,                if(count_i > 300)这个判断总是为假 ...

前面看了下这个问题,这个你只需要把count_i给改成unsigned int就可以了
回复

使用道具 举报

7#
ID:819974 发表于 2021-7-22 17:01 | 只看该作者
wskfengliu 发表于 2021-4-5 10:13
1、读取芯片的配置数据,这个函数其实是可以不用调用的是吧?
2、您这个被测试信号很小?要不然增益怎么设 ...

读取和配置数据看情况,一般多是默认的,所以可以不用,被测信号的话我用的是电子秤,一般来说信号还是变化很大的
回复

使用道具 举报

8#
ID:485367 发表于 2021-8-18 16:55 | 只看该作者
感谢分享,验证过的外设驱动很有用,可以节省项目时间
回复

使用道具 举报

9#
ID:1117044 发表于 2024-4-17 18:38 | 只看该作者
感谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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