ADS1247 STM32使用例程
文件:ADS1247.h
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include "stm32f10x.h" #define WAKEUP 0x00 //Exit sleep mode #define SLEEP 0x02 //Enter sleep mode #define SYNC 0x04 //Synchronize the A/D conversion #define RESET 0x06 //Reset to power-up values #define NOP 0xff //No operation #define RDATA 0x12 //Read data once #define RDATAC 0x14 //Read data continuously #define SDATAC 0x16 //Stop reading data continuously #define RREG 0x20 //Read from register rrrr 0010 rrrr (2xh) #define WREG 0x40 //Write to register rrrr 0100 rrrr (4xh) #define Reg_MUX0 0x00 #define Reg_VBias 0x01 #define Reg_MUX1 0x02 #define Reg_SYS0 0x03 #define Reg_CFC0 0x04 #define Reg_CFC1 0x05 #define Reg_CFC2 0x06 #define Reg_FSC0 0x07 #define Reg_FSC1 0x08 #define Reg_FSC2 0x09 #define Reg_IDAC0 0x0a #define Reg_IDAC1 0x0b #define Reg_GPIOCFG 0x0c #define Reg_GPIODIR 0x0d #define Reg_GPIODAT 0x0e extern void ADS1247_Init(void); extern u32 ReadAdADSConversionData(void); extern u8 ADS_RREG(u8 Address,u8 number);
文件:ADS1247.c
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231#include "stm32f10x_gpio.h" #include "ADS1247.h" #include "MyClass.h" #define ADS_SCLK_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_13) //时钟高电平 #define ADS_SCLK_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_13) //时钟低电平 #define ADS_CS_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_12) //片选 高 #define ADS_CS_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_12) //片选 低 有效 #define ADS_DIN_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_15) //数据 高 #define ADS_DIN_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_15) //数据 低 u8 Flag_calibration = 0; /* 发送一个字节数据 */ void ADS_WriteByte(u8 WriteData) { u8 i=0; ADS_CS_LOW;//片选拉低有效 for(i=0;i<8;i++) { if (WriteData & 0x80) ADS_DIN_HIGH; else ADS_DIN_LOW; ADS_SCLK_HIGH; WriteData = WriteData << 1; ADS_SCLK_LOW; } ADS_CS_HIGH; } u8 ADS_ReadByte(void) { u8 i=0; u8 ReadData=0; ADS_CS_LOW; for(i=0;i<8;i++) { delay_1us(); ADS_SCLK_HIGH; ReadData = ReadData << 1; ReadData |= (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)); delay_1us(); ADS_SCLK_LOW; } ADS_CS_HIGH; return(ReadData); } void ADS_Reset() { ADS_WriteByte(RESET); delay_10us(); } void ADS_Sleep() { ADS_WriteByte(SLEEP); delay_10us(); } void ADS_Wakeup() { ADS_WriteByte(WAKEUP); ADS_SCLK_HIGH; delay_1us(); ADS_SCLK_LOW; delay_10us(); } u8 WaiteRDY(void) { ADS_CS_LOW; while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)); ADS_CS_HIGH; return 0; } u32 ReadAdADSConversionData(void) { u8 flag = 0; u8 i=0; u32 ConvertData = 0; u8 WriteData = RDATA;//读取单次数据 static u32 lastvalue = 0; /* 等待DRDY拉低,等待数据转换完成 */ if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))return lastvalue; // ADS_CS_LOW; // for(i=0;i<8;i++) // { // if (WriteData & 0x80) // ADS_DIN_HIGH; // else // ADS_DIN_LOW; // ADS_SCLK_HIGH; // WriteData = WriteData << 1 ; // ADS_SCLK_LOW; // } // ADS_DIN_HIGH; ADS_CS_LOW; for(i=0;i<24;i++) { ADS_SCLK_HIGH; ConvertData = ConvertData << 1; ConvertData |= (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)); ADS_SCLK_LOW; } ADS_CS_HIGH; lastvalue = ConvertData; return(ConvertData); } u8 ADS_RREG(u8 Address,u8 number) { u8 i=0; u8 ReadData = 0; ADS_CS_LOW; for(i=0;i<8;i++) { ADS_SCLK_HIGH; if(Address & 0x80) ADS_DIN_HIGH; else ADS_DIN_LOW; Address = Address << 1 ; ADS_SCLK_LOW; } delay_1us();//读写寄存器必须有此延时,否则无法芯片无法识别 for(i=0;i<8;i++) { ADS_SCLK_HIGH; if (number & 0x80) ADS_DIN_HIGH; else ADS_DIN_LOW; number = number << 1 ; ADS_SCLK_LOW; } delay_1us();//读写寄存器必须有此延时,否则无法芯片无法识别 ADS_DIN_HIGH; for(i=0;i<8;i++) { ADS_SCLK_HIGH; ReadData = ReadData << 1; ReadData |= (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)); ADS_SCLK_LOW; } delay_1us();//读写寄存器必须有此延时,否则无法芯片无法识别 //ADS_CS_HIGH; return(ReadData); } /* 写寄存器 * Address : 寄存器地址 0100 rrrr (0x4x) * number : 写入字节数 实际字节数-1,此处只需写一个字节固定为0x00 * data : 写入字节 */ void ADS_WREG(u8 Address,u8 number,u8 data) { u8 i=0; ADS_CS_LOW; for(i=0;i<8;i++) { if (Address & 0x80) ADS_DIN_HIGH; else ADS_DIN_LOW; ADS_SCLK_HIGH; Address = Address << 1 ; ADS_SCLK_LOW; } delay_1us();//读写寄存器必须有此延时,否则无法芯片无法识别 for(i=0;i<8;i++) { if (number & 0x80) ADS_DIN_HIGH; else ADS_DIN_LOW; ADS_SCLK_HIGH; number = number << 1 ; ADS_SCLK_LOW; } delay_1us(); //读写寄存器必须有此延时,否则无法芯片无法识别 for(i=0;i<8;i++) { if (data & 0x80) ADS_DIN_HIGH; else ADS_DIN_LOW; ADS_SCLK_HIGH; data = data << 1 ; ADS_SCLK_LOW; } delay_1us();//读写寄存器必须有此延时,否则无法芯片无法识别 ADS_DIN_HIGH; ADS_CS_HIGH; } void ADS1247_Init(void) { u8 i=0; u8 WriteData = RDATAC;//连续读数据 RDATA RDATAC /* 写寄存器 ADC采集速率 40SPS */ ADS_WREG(Reg_SYS0 | WREG,0x00,0x03); /* 设置为连续读取模式 */ /* 等待DRDY拉低,等待数据转换完成 */ while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)) { } ADS_CS_LOW; for(i=0;i<8;i++) { if (WriteData & 0x80) ADS_DIN_HIGH; else ADS_DIN_LOW; ADS_SCLK_HIGH; WriteData = WriteData << 1 ; ADS_SCLK_LOW; } ADS_DIN_HIGH; //寄存器配置完成,拉高DIN 否则数据会出错 }
复制代码
1
2
3
4使用的是STM32f103单片机,用引脚模拟时序操作。 问题:无法读取寄存器操作,回复的数据是0,通过示波器查看回复的数据一直为低。 解决:通过示波器观察到,读寄存器时,发送的指令三个连在一起。中间添加延时后即可接受到回复数据,写入寄存器和读取寄存器的值一致,以上代码为修改后的代码。
最后
以上就是愤怒心情最近收集整理的关于ADS1247使用例程的全部内容,更多相关ADS1247使用例程内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复