|
- #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;
- }
復制代碼
|
-
-
STM32-CS1237.7z
2020-12-2 16:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
177.74 KB, 下載次數: 160, 下載積分: 黑幣 -5
評分
-
查看全部評分
|