|
- #include "stm32f10x.h"
- #include "uart.h"
- #include "cs1237.h"
- // 程序运行在STM32F103系列 主频72MHz
- // CS1237程序要注意的两个时序问题:
- // 1.CLK拉低以后 要等待300ms OUT引脚才会自动变低
- // 2.CLK的时钟频率最大是1.1Mhz 所以CLK=1和CLK=0之间 要加入至少0.5us的延时
- /**
- * @brief Main program.
- * @param None
- * @retval None
- */
- int main(void)
- {
- int32_t temp;
-
- USART1_Init(); // 初始化串口1 波特率9600
- CS1237_Init_JX();
- delay_ms(300);
- CS1237_Config();
- delay_ms(100);
- USART1_Send_byte(Read_Config());
-
- while (1)
- {
- delay_ms(1000);
- temp = Read_CS1237();//读取CS1237的数据
- printf("%d\r\n", temp);// 把读取到的数据发送到串口
- }
- }
复制代码- #include "cs1237.h"
- #include "uart.h"
- //OUT引脚输入输出 方向设置 PA3
- #define OUT_IN() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8<<12;}
- #define OUT_OUT() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3<<12;}
- // PA2-----CLK
- // PA3-----OUT
- void Delay1us(void)
- {
- __IO uint32_t t=5;
-
- while(t--);
- }
- void Delay1ms(void)
- {
- __IO uint32_t t=8000;
-
- while(t--);
- }
- void delay_ms(__IO uint16_t ms)
- {
- do{
- Delay1ms();
- }while(ms--);
- }
- // 初始化PA2 PA3
- // PA2-----CLK
- // PA3-----OUT
- void CS1237_Init_JX(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- // PA2 ----- CLK 设置为输出
- // PA3 ----- OUT 设置为输出
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK拉高
- GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT拉高
- }
- //配置CS1237芯片
- void CS1237_Config(void)
- {
- unsigned char i;
- unsigned char dat;
- unsigned int count_i=0;//溢出计时器
-
- dat = 0X0C; //芯片地配置 内部REF 输出40HZ PGA=128 通道A 0X1C
- OUT_OUT();
- GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
- OUT_IN();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2);// 时钟拉低
- while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1) //等待CS237准备好
- {
- delay_ms(1);
- count_i++;
- if(count_i > 300)
- {
- OUT_OUT();
- GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT引脚拉高
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK引脚拉高
- return;//超时,则直接退出程序
- }
- }
- for(i=0;i<29;i++)// 1 - 29
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();
- }
- OUT_OUT();
- GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//30
- GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//31
- GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//32
- GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//33
- GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//34
- GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//35
- GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//36
- //37 写入了0x65
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();
-
- for(i=0;i<8;i++)// 38 - 45个脉冲了,写8位数据
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- if(dat&0x80)
- GPIO_SetBits(GPIOA, GPIO_Pin_3);// OUT = 1
- else
- GPIO_ResetBits(GPIOA, GPIO_Pin_3);
- dat <<= 1;
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();
- }
- GPIO_SetBits(GPIOA, GPIO_Pin_3);// OUT = 1
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();
- }
- // 读取芯片的配置数据
- unsigned char Read_Config(void)
- {
- unsigned char i;
- unsigned char dat=0;//读取到的数据
- unsigned char count_i=0;//溢出计时器
- // unsigned char k=0,j=0;//中间变量
-
- OUT_OUT();
- GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
- OUT_IN();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2);//时钟拉低
- while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)//等待芯片准备好数据
- {
- delay_ms(1);
- count_i++;
- if(count_i > 300)
- {
- OUT_OUT();
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT=1;
- return 1;//超时,则直接退出程序
- }
- }
- for(i=0;i<29;i++)// 产生第1到29个时钟
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();
- }
-
- OUT_OUT();
-
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_SetBits(GPIOA, GPIO_Pin_3);
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();// 这是第30个时钟
-
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_3);
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();// 这是第31个时钟
-
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_SetBits(GPIOA, GPIO_Pin_3);
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();//32
-
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_3);
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();//33
-
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_SetBits(GPIOA, GPIO_Pin_3);
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();//34
-
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_SetBits(GPIOA, GPIO_Pin_3);
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();//35
-
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_3);
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();//36
-
- GPIO_SetBits(GPIOA, GPIO_Pin_3);
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();//37 写入0x56 即读命令
-
- dat=0;
- OUT_IN();
- for(i=0;i<8;i++)// 第38 - 45个脉冲了,读取数据
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();
- dat <<= 1;
- if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)
- dat++;
- }
-
- //第46个脉冲
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();
-
- OUT_OUT();
- GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
-
- return dat;
- }
- //读取ADC数据,返回的是一个有符号数据
- int32_t Read_CS1237(void)
- {
- unsigned char i;
- uint32_t dat=0;//读取到的数据
- unsigned char count_i=0;//溢出计时器
- int32_t temp;
-
- OUT_OUT();
- GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
- OUT_IN();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2);//时钟拉低
- while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)//等待芯片准备好数据
- {
- delay_ms(1);
- count_i++;
- if(count_i > 300)
- {
- OUT_OUT();
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT=1;
- return 1;//超时,则直接退出程序
- }
- }
-
- dat=0;
- for(i=0;i<24;i++)//获取24位有效转换
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- dat <<= 1;
- if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)
- dat ++;
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();
- }
-
- for(i=0;i<3;i++)//接着前面的时钟 再来3个时钟
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
- Delay1us();
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
- Delay1us();
- }
-
- OUT_OUT();
- GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT = 1;
-
- if(dat&0x00800000)// 判断是负数 最高位24位是符号位
- {
- temp=-(((~dat)&0x007FFFFF) + 1);// 补码变源码
- }
- else
- temp=dat; // 正数的补码就是源码
-
- return temp;
- }
复制代码
|
评分
-
查看全部评分
|