51 单片机实战教程(13 外围芯片驱动程序之CS1237芯片驱动)

2023-10-27

        CS1237芯片是一枚国产24位A/D转换芯片,输出速率可选:10Hz、40Hz、640Hz、1.28kHz。内置时钟电路,不需外部晶振。带可编程PGA,PGA放大倍数可选:1、2、64、128。2 线 SPI通信接口,最快速率为 1.1MHz。供电电压:5V/3.3V。芯片应用场合:工业过程控制、电子秤、血压计、智能变换器、便携式设备等。

          CS1237采用SOP8封装,Pin脚定义如下:

       CS1237 SPI  串口通信

其基本时序如图所示:

CS1237读取数据时序图1:

CS1237读取数据时序图 2:

 读取数据时序表:

功能配置:

SPI命令字:

 CS1237有 2 个命令字,命令字的长度为 7bits,命令字描述如下:

CS1237命令字说明表:

CS1237 Config寄存器:

有了这些,就可以写CS1237的驱动库函数了。新建两个文件分别以cs1237.h,cs1237.c存入C51 Template文件夹下Library文件夹中。完成后的头文件如下:

/*cs1237.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 12/10/2021
*/
#ifndef __CS1237_H__
#define __CS1237_H__

#include "mtype.h"
#include "delay.h"
#include "myport.h"    //CS1237_SCLK and CS1237_DOUT were defined

extern FSYSCLOCK FSCLK;
//************************************************************************************************************
typedef enum
{
	C1237_10HZ = 0,
	C1237_40HZ = 1,
	C1237_640HZ = 2,
	C1237_1280HZ = 3
}C1237_SPEED;

//************************************************************************************************************
typedef enum
{
	C1237_PGA_1 = 0,
	C1237_PGA_2 = 1,
	C1237_PGA_64 = 2,
	C1237_PGA_128 = 3
}C1237_PGA;

//************************************************************************************************************
typedef enum
{
	C1237_CHA = 0, //adc channel
	C1237_RST = 1, //cheap reserved
	C1237_TEM = 2, //temperature test
	C1237_INS = 3 //internal short
}C1237_CHN;

/************************************************************************************************************
Function: C1237_InClk();
Return value: void
Discription: C1237 input a clk pusle for to read or write
Example:
  C1237_InClk();
*************************************************************************************************************/
void C1237_InClk();

/************************************************************************************************************
Function: CS1237_ReadReg();
Return value: ui8
Discription: read CS1237 register
Example:
  CS1237_ReadReg();
*************************************************************************************************************/
ui8 CS1237_ReadReg();

/************************************************************************************************************
Function: C1237_WriteReg(ui8 mData);
Return value: void
Discription: wreite data to C1237 register
Example:
  C1237_WriteReg(mData);
*************************************************************************************************************/
void C1237_WriteReg(ui8 mData);

/************************************************************************************************************
Function: C1237_Init(BOOL refOutable,C1237_SPEED msel,C1237_PGA mselPga,C1237_CHN mselChn);
Return value: void
Discription: CS1237 init
Example:
  C1237_Init(0,C1237_10HZ,C1237_PGA_1,C1237_CHA);//ref voltage out disable,speed 10Hz,Pga 1, work at Adc mode
*************************************************************************************************************/
void C1237_Init(BOOL refOutable,C1237_SPEED msel,C1237_PGA mselPga,C1237_CHN mselChn);

/************************************************************************************************************
Function: C1237_ReadResult();
Return value: ui32
Discription: read C1237 A/D result
Example:
  C1237_ReadResult();
*************************************************************************************************************/
ui32 C1237_ReadResult();

#endif

完成后的源代码如下:

/*cs1237.c
  Designed by Bill Liu
  Version 0.1 
  Modified last by Bill Liu on 2/18/2022
*/

#include "cs1237.h"

//*************************************************************************************************************
void C1237_InClk()
{
  CS1237_SCLK= 1;
  Delayxus(2,FSCLK); 
  CS1237_SCLK = 0;
  Delayxus(2,FSCLK); 
}
//End of C1237_InClk()

//*************************************************************************************************************
ui8 CS1237_ReadReg() 
{
  ui8 i = 0;
	ui8 tem = 0;
	CS1237_SCLK = 0;
	CS1237_DOUT = 1;
	while( CS1237_DOUT);
	for(i = 0; i < 27; i++) //1-26th CLK
			C1237_InClk();;
	CS1237_DOUT = 1; //cs1237 direction input
	//C1237_InClk();	 //27th CLK
	C1237_InClk();	 //28th CLK
	C1237_InClk();   //29th CLK
	tem = 0x56;
	for(i = 0; i < 7; i++) //30~36th CLK
	{
		
		if(tem &0x40)
			CS1237_DOUT = 1;
		else
			CS1237_DOUT = 0;
		C1237_InClk();;
		tem <<= 1;
	}
	CS1237_DOUT = 1; //cs1237 change to output direction
	C1237_InClk();; //37th CLK
	for(i = 0; i < 8; i++) //37~45th CLK
	{
		tem <<= 1;
		C1237_InClk();
		if(CS1237_DOUT)
			tem++;
	}
	C1237_InClk();; //46th CLK
  return tem;
}
//End of CS1237_ReadReg()

//*************************************************************************************************************
void C1237_WriteReg(ui8 mData)
{
  ui8 i = 0;
	ui8 tem = 0;
	CS1237_SCLK = 0;
	CS1237_DOUT = 1;
	while(CS1237_DOUT);
	for(i = 0; i < 27; i++) //1~26th CLK
		C1237_InClk();
	CS1237_DOUT = 1; //force high
	//C1237_InClk();//27th CLK
	C1237_InClk();//28th CLK
	C1237_InClk();//29th CLK
	tem = 0x65;
	for(i = 0; i < 7; i++)//30~36th CLK
	{
		
		if(tem & 0x40)
			CS1237_DOUT = 1;
		else
			CS1237_DOUT = 0;
		C1237_InClk();
		tem <<= 1;
	}
	CS1237_DOUT = 0; //direction chage to intput direction
	C1237_InClk(); //37th CLK
	for(i = 0; i < 8; i++) //38~45th CLK
	{
		
		if(mData&0x80)
			CS1237_DOUT = 1;
		else
			CS1237_DOUT = 0;
		mData <<= 1;
		C1237_InClk(); 
	}
	C1237_InClk();//46th CLK

}
//End of C1237_WriteReg(ui8 mData)

//*************************************************************************************************************
void C1237_Init(BOOL refOutable,C1237_SPEED msel,C1237_PGA mselPga,C1237_CHN mselChn)
{
  ui8 tem = 0;
  if(refOutable)
    ResetBit(&tem, 6);
  else
    SetBit(&tem, 6);
  SetBits(&tem,5,4,msel);
  SetBits(&tem,3,2,mselPga);
  SetBits(&tem,1,0,mselChn);
  C1237_WriteReg(tem);
}
//End of C1237_Init(BOOL refOutable,C1237_SPEED msel,C1237_PGA mselPga,C1237_CHN mselChn) 

//*************************************************************************************************************
ui32 C1237_ReadResult()
{
  ui8 i;
	ui32 rdata = 0;
  CS1237_SCLK= 0;
	CS1237_DOUT = 1;
  while(CS1237_DOUT);          //waite ADC finish
  for(i = 0; i < 24; i++)
  {
    rdata <<= 1;
    C1237_InClk();
    if(CS1237_DOUT) //read data
      rdata++;
  }
  C1237_InClk();
  C1237_InClk();
  C1237_InClk();
  return rdata;
}
//End of C1237_ReadResult()

受一些因素影响,可能个别ADC数据不是很准确,需要消除或减小其影响,我们可以采用多值平均法,阀值剔除法等数字滤波手法,有了以上库函数就可以轻松实现。读写验证如下:

 上面串口接收区的值为寄存器读出值。

下面是AD转换结果。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51 单片机实战教程(13 外围芯片驱动程序之CS1237芯片驱动) 的相关文章

  • leetcode shell题解

    195 Tenth Line print just the 10th line of a file sed n 10 10p file txt 194 Transpose File For example if file txt has t

随机推荐

  • 主流编程语言介绍

    目录 前言 一 编程语言作用 1 1 Python 1 2 Java 1 3 JavaScript 1 4 Go 1 5 PHP 二 Python和PHP学习网站 2 1 菜鸟教程 2 2 W3school 总结 前言 主流的编程语言有很多
  • 流图(程序图)表示程序的控制流——>McCabe方法度量程序空间复杂度

    McCabe方法 McCabe方法根据程序控制流的复杂程度定量度量程序的复杂程度 这样度量出的结果称为程序的环形复杂度 为了突出表现程序的控制流 人们通常使用流图 也称程序图 1 流图 所谓流图实质上是 退化了的 程序流程图 它仅仅描绘程序
  • OpenCDA代码学习笔记(1)——CARLA-SUMO联合仿真demo

    本文主要记录一下自己最近学习开源项目OpenCDA代码的笔记 简而言之 该项目用Python实现了全栈式自动驾驶算法的开发 也实现了CARLA SUMO的联合仿真 该部分参考了CARLA官方给出的联合仿真实例代码 学习该项目代码的主要目的是
  • 超详细Python安装教程

    Python官网地址 https www python org 1 进入官网 点击download选择系统 2 点击最新的Python版本 3 进入新页面 下拉至Files处 选择系统位数的执行运行程序 我的系统是64位 4 点击安装文件
  • 微信小程序开发笔记—获取颜色十六进制值

    获取颜色十六进制值 十六进制颜色代码是在软件中设定颜色的代码 可以先查询以下目标颜色的RGB值 然后将三个值均转换成十六进制即是目标颜色的十六进制值 转换这里可以使用电脑计算器中的程序员模式 比如目标颜色为香芋紫 查询得知该颜色的RGB值分
  • C++57个入门知识点_55 函数模板(template<typename T>;T GetMin(T a, T b){};函数模板定义;隐式实例化;显式实例化;函数模板特例;实例化后模板才有效)

    本篇主要讨论函数模板的相关知识点 前言 typename 是一个C 程序设计语言中的关键字 当用于泛型编程时是另一术语 class 的同义词 这个关键字用于指出模板声明 或定义 中的非独立名称 dependent names 是类型名 而非
  • 从 BBR 失速到带宽探测

    看一下 pacing 流失速的成因 一段时间收不到 ack 丢了 ack 自时钟 cwnd 将耗尽 bbr 虽有 cwnd gain 上图没有表现 但在该 cwnd gain 下不依赖 ack 持续坚持发送多久取决于 cwnd gain 的
  • hashmap的常见静态属性和方法

    1 hashmap的常见的静态属性 hashmap默认的容器大小 16 static final int DEFAULT INITIAL CAPACITY 1 lt lt 4 hashmap默认最大的容器大小 超过不再扩容 static f
  • MySQL存储过程调试工具dbForge Studio for MySQL

    https blog csdn net zhanghongzheng3213 article details 51462113 https blog csdn net ggjlvzjy article details 49069569 ut
  • pytorch【生成自己的数据集】

    文章目录 一 导入相关的库 二 生成数据集 定义一个创建数据集的函数 三 创建我们分类数据集 定义一个创建数据集的函数 一 导入相关的库 import skimage from skimage import io 用来导入图片 import
  • vue项目全局去掉网页滚动条

    在App vue里增加以下样式
  • python包相对导入导入上层文件夹包功能使用

    python导入当前文件夹中的包非常简单 但是导入上层文件夹的包就比较困难了 不过还好python解释器给出了包相对导入功能 但是与平常的相对目录写法不太一样 新手比较难以发现 以下为对python官方文档的装载 给定以下的包布局结构 pa
  • keil5仿真错误:Encountered an improper argument 原因及解决办法

    报错如图 现象 仿真结束 退出仿真时报错 无法正常关闭keil软件 只能通过任务管理器强制结束进程关闭 解决办法 清除所有断点再关闭
  • 基于Java基础的家庭收支记账软件

    文章目录 前言 一 前期准备 二 整体功能 三 功能模块 四 功能浅谈 1 AccountInfo 类 2 收支明细 3 登记收入 支出 4 查询账单 五 收获 六 总结 前言 学习完Java基础之后 狗子我便在网上 尚硅谷 寻找了这个练手
  • [力扣刷题总结](字典树篇)

    文章目录 字典树 字典树的概念 字典树的功能 字典树的实现及代码实现 208 实现 Trie 前缀树 解法1 实现Trie 472 连接词 解法1 字典树 DFS 820 单词的压缩编码 解法1 字典树 字典树 字典树的概念 本小节主要参考
  • 讲讲BW/4 HANA和BW on HANA的区别

    前言部分 大家可以关注我的公众号 公众号里的排版更好 阅读更舒适 正文部分 很多人知道BW on HANA BO on HANA 但却不太了解BW 4 HANA 这篇文章我们就来简单讲讲区别 从BW onHANA 7 3开始 直到BW在HA
  • 正确的打日志姿势

    前言 比较认同 转载一下 使用slf4j 使用门面模式的日志框架 有利于维护和各个类的日志处理方式统一 实现方式统一使用 Logback框架 什么时候应该打日志 当你遇到问题的时候 只能通过debug功能来确定问题 你应该考虑打日志 良好的
  • matlab中的科学记数法变成小数形式

    例如 假如rectx的形式在命令窗口显示 rectx 1 0e 05 5 2294 5 2294 5 2294 5 2294 5 2294 那么 命令窗口输入vpa rectx ans 522938 95232622162438929080
  • MyBatis动态推理参数类型

    前言 思考一个问题 前面的 和 的区别中 我们知道了 MyBatis底层调用的是preparestatement这种预编译的方式 这种方式sql语句会预先编程 select from t user where id 这种形式 随后调用set
  • 51 单片机实战教程(13 外围芯片驱动程序之CS1237芯片驱动)

    CS1237芯片是一枚国产24位A D转换芯片 输出速率可选 10Hz 40Hz 640Hz 1 28kHz 内置时钟电路 不需外部晶振 带可编程PGA PGA放大倍数可选 1 2 64 128 2 线 SPI通信接口 最快速率为 1 1M