我写这款芯片驱动程序时也是参考一些网站,论坛,但是没有我自己想要的,于是乎我自己根据芯片手册自己撸调试完成,已在项目中使用。
文件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 }
复制代码