STM8L152模拟IIC程序(5)

2025-06-23

92. _delay_5us(5); 93.

94. GPIO_WriteHigh(I2C_PORT, I2CSCL); 95.

96. _delay_5us(5); 97.

98. GPIO_WriteHigh(I2C_PORT, I2CSDA);

99. 100. } 101.

102. //*************************************************************** 103.

104. //ROUTINE NAME : I2C_Ack 105.

106. //INPUT/OUTPUT : None. 107.

108. //DESCRIPTION : Acknoledge generation from now. 109.

110. //COMMENTS : Transfer sequence = DATA, ACK.

111.

112. //*************************************************************** 113.

114. void I2C_Rack(void) 115. 116. { 117.

118. GPIO_WriteLow(I2C_PORT, I2CSDA); 119.

120. _delay_5us(5); 121.

122. GPIO_WriteHigh(I2C_PORT, I2CSCL);

123.

124. _delay_5us(5); 125.

126. GPIO_WriteLow(I2C_PORT, I2CSCL); 127.

128. _delay_5us(5); 129. 130. } 131. 132.

133. //*************************************************************** 134.

135. //ROUTINE NAME : I2C_nAck 136.

137. //INPUT/OUTPUT : None. 138.

139. //DESCRIPTION : Non acknoledge generation from now. 140.

141. //COMMENTS : Transfer sequence = DATA, NACK. 142.

143. //*************************************************************** 144.

145. void I2C_nAck (void) 146. 147. { 148.

149. GPIO_WriteHigh(I2C_PORT, I2CSDA); 150.

151. _delay_5us(5); 152.

153. GPIO_WriteHigh(I2C_PORT, I2CSCL); 154.

155. _delay_5us(5); 156.

157. GPIO_WriteLow(I2C_PORT, I2CSCL); 158.

159. _delay_5us(5); 160. 161. }

162.

163. //*************************************************************** 164.

165. // Send a byte to the slave 写一个数据没有应答

166.

167. // return I2C_ERR OR I2C_CRR 168.

169. //*************************************************************** 170.

171. bool SendByte(UCHAR I2cData) 172. 173. {

174.

175. UCHAR i; 176.

177. bool I2CStatus; 178. 179.

180. for(i=0; i<8; i++) 181. 182. { 183.

184. GPIO_WriteLow(I2C_PORT, I2CSCL); 185.

186. _delay_5us(5); 187.

188. if(I2cData & 0x80) 189.

190. {GPIO_WriteHigh(I2C_PORT, I2CSDA);} 191.

192. else 193.

194. {GPIO_WriteLow(I2C_PORT, I2CSDA);} 195.

196. GPIO_WriteHigh(I2C_PORT, I2CSCL); 197.

198. _delay_5us(5); 199.

200. I2cData <<= 1;

201. 202. } 203.

204. GPIO_WriteLow(I2C_PORT, I2CSCL); 205.

206. GPIO_WriteHigh(I2C_PORT, I2CSDA);//发送完一字节,接收应答 207. 208. 209.

210. I2CDataInOut(I2CDataIn); 211. 212.

213. GPIO_WriteHigh(I2C_PORT, I2CSCL); 214.

215. _delay_5us(5); 216.

217. if(GPIO_ReadInputPin(I2C_PORT,I2CSDA) == 0) 218.

219. { 220.

221. I2CStatus = I2C_CRR; 222.

223. } 224.

225. else 226.

227. { 228.

229. I2CStatus = I2C_ERR; 230.

231. } 232.

233. I2CDataInOut(I2CDataOut); 234.

235. return I2CStatus; 236.

237. } 238. 239.

240. //*************************************************************** 241.

242. //ROUTINE NAME : I2Cm_RxData 243.

244. //INPUT/OUTPUT : Last byte to receive flag (active high)/Received data byte

.

245.

246. //DESCRIPTION : Receive a data byte. 247.

248. //COMMENTS : Transfer sequence = DATA, ACK, EV7... 249.

250. //*************************************************************** 251.

252. UCHAR RcvByte(void) 253.

254. { 255.

256. UCHAR i; 257.

258. UCHAR ReadByte=0; 259.

260. GPIO_WriteHigh(I2C_PORT, I2CSDA); 261. 262.

263. I2CDataInOut(I2CDataIn); 264.

265. _delay_5us(10); 266.

267. for(i=0; i<8; i++) 268. 269. { 270.

271. ReadByte <<= 1; 272.

273. GPIO_WriteLow(I2C_PORT, I2CSCL); 274.

275. _delay_5us(5); 276.

277. GPIO_WriteHigh(I2C_PORT, I2CSCL); 278.

279. _delay_5us(5); 280. 281.

282. if(GPIO_ReadInputPin(I2C_PORT,I2CSDA) == 1) 283.

284. {ReadByte |= 0x01;} 285.

286. _delay_5us(5);

287.

288. } 289.

290. GPIO_WriteLow(I2C_PORT, I2CSCL); 291.

292. I2CDataInOut(I2CDataOut); 293.

294. _delay_5us(10);

295.

296. return ReadByte; 297. 298. } 299. 300.

301. /******************************************************* 302.

303. 读N个数据,参数:?

304.

305. wrDAdr: write device-address 写器件地址?? 306.

307. wordAdr: word address 读数据的寄存器地址?? 308.

309. rdDAdr: read device-address 读器件地址 310.

311. *pRdDat: p->read data 读数据指针 312.

313. num: number 需要读数据的个数

314.

315. *******************************************************/ 316.

317. bool I2C_Read(UCHAR wrDAdr,UCHAR wordAdr,UCHAR *pRdDat,UCHAR num) 318. 319. { 320.

321. bool I2CAck; 322.

323. UCHAR i=0; 324.

325. UCHAR rdDAdr;

326.

327. rdDAdr = wrDAdr+1; //读器件地址为写地址加1 328.

329. I2C_Start(); /*启动I2C*/

330.

331. _delay_5us(5); 332.

333. I2CAck = SendByte(wrDAdr); /*发写器件地址*/ 334.

335. if(!I2CAck) 336. 337. {

338.

339. return I2C_ERR; 340. 341. } 342.

343. I2CAck = SendByte(wordAdr); /*发寄存器地址*/ 344.

345. if(!I2CAck)


STM8L152模拟IIC程序(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:哈大冬季施工措施

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219