关于CS1238开源驱动代码

我写这款芯片驱动程序时也是参考一些网站,论坛,但是没有我自己想要的,于是乎我自己根据芯片手册自己撸调试完成,已在项目中使用。

文件C和H通用的,自行添加进入工程即可使用。

源程序如下:
#include "CS1238.h"
  • /******************************************************************************
  • *函数名                :CS1238_Init
  • *参数                        :无
  • *返回                        :无
  • *描述                        :初始化CS1238
  • ********************************************************************************/
  • void CS1238_Init(void)
  • {
  • #if 1
  •         GPIO_InitTypeDef GPIO_InitStructure;
  •         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE );
  •       
  •         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;
  •         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
  •         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  •         GPIO_Init(GPIOD, &GPIO_InitStructure);
  •         GPIO_ResetBits(GPIOD, GPIO_Pin_13|GPIO_Pin_14);                 //PD13,PD14 输出高
  • #endif
  • }
  • /******************************************************************************
  • *函数名                :F_AD_Clock
  • *参数                        :无
  • *返回                        :无
  • *描述                        :AD时钟
  • ********************************************************************************/
  • static void F_AD_Clock(void)               
  • {
  •         SCLK = 1;                     //高电平不能超过100uS,否则进入powerdown的休眠模式.
  •         delay_us(5);  
  •         SCLK = 0;
  •         delay_us(5);
  • }
  • /******************************************************************************
  • *函数名                :CS1238_RD_DATA
  • *参数                        :无
  • *返回                        :AD值
  • *描述                        :CS1238读AD
  • ********************************************************************************/
  • long CS1238_RD_DATA(void)
  • {      
  •         unsigned int i;
  •         long ad_data;
  •         CS1238_DRDY_IN();
  •         ad_data = 0;
  •         SCLK = 0;
  •         delay_us(10);
  •         if(!SDAT_IN)
  •         {
  •                 for(i=1; i<=24; i++)               
  •                 {
  •                         ad_data <<= 1;                                                  
  •                         F_AD_Clock();                                //1-24个SCLK
  •                         if(SDAT_IN) ad_data++;                       
  •                 }
  •                 F_AD_Clock();                                        //第25个SCLK.
  •                 F_AD_Clock();                                        //第26个SCLK.
  •                 F_AD_Clock();                                        //第27个SCLK.                       
  •         }
  •                                           
  •         while(SDAT_IN)
  •                 delay_us(10);
  •         return (ad_data^0x800000)/100;
  • }
  • /******************************************************************************
  • *函数名                :CS1238_WR_CONFIG
  • *参数                        :config 寄存器配置值
  • *返回                        :无
  • *描述                        :CS1238写寄存器配置
  • ********************************************************************************/
  • void CS1238_WR_CONFIG(u8 config)
  • {
  •         #if 1
  •         u8 i,CMD;
  •         CS1238_DRDY_IN();                                //配置IO口为输入
  •         SCLK = 0;
  •         delay_us(10);
  •         if(!SDAT_IN)
  •         {
  •                 for(i=1; i<=29; i++)        //第1~29个SCLK.
  •                 {
  •                         F_AD_Clock();
  •                 }
  •                
  •                 CS1238_DRDY_OUT();                //配置IO口为输出
  •                 CMD = 0X65;                                                //写配置
  •                 for(i=30; i<=36; i++)        //30~36写0X65中低7位,写配置寄存器命令
  •                 {               
  •                         if(CMD & 0x80)
  •                                 SDAT_OUT = 1;
  •                         else
  •                                 SDAT_OUT = 0;
  •                         delay_us(2);
  •                         SCLK = 1;                  //高电平不能超过100uS,否则进入powerdown的休眠模式.
  •                         delay_us(5);
  •                         SCLK = 0;
  •                         delay_us(5);
  •                         CMD <<= 1;                                        //最高位移除,留底7位
  •                 }
  •                                        
  •                 F_AD_Clock();                                        //第37个SCLK,CS1238自动切换DRDY/DOUT 的方向.
  •                 for(i=38; i<=45; i++)        //第38~45个SCLK写配置寄存器
  •                 {
  •                         if(config & 0x80)
  •                                 SDAT_OUT = 1;
  •                         else
  •                                 SDAT_OUT = 0;      
  •                         delay_us(2);
  •                         SCLK = 1;                  //高电平不能超过100uS,否则进入powerdown的休眠模式.
  •                         delay_us(5);                                 
  •                         SCLK = 0;
  •                         delay_us(5);
  •                         config <<= 1;
  •                 }
  •                 CS1238_DRDY_IN();
  •                 F_AD_Clock();                                        //第46个SCLK.
  •                 delay_us(10);
  •         }
  •         #endif
  • }
  • 复制代码