FM31256.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. /*--------------------------------------------------------------------------------------
  2. * @file FM31256.c
  3. * @author ZhangJing
  4. * @version base on stm32f0x
  5. * @date 2015.09.11
  6. * @brief FM31256驱动
  7. ---------------------------------------------------------------------------------------*/
  8. /*--------------------------------------------------------------------------------------
  9. * @file FM31256.c
  10. * @author ZhangJing
  11. * @version base on stm32f0x
  12. * @date 2015.09.11
  13. * @brief FM31256驱动
  14. ---------------------------------------------------------------------------------------*/
  15. #include "stm32f10x_gpio.h"
  16. #include "TypeDefine.h"
  17. #include "IICSetup.h"
  18. #include "FM31256.h"
  19. /*************************************************************************************
  20. * Function: hex_to_bcd
  21. * Object: 十六进数转换成BCD码
  22. * 输入: unsigned char condata需转换数据
  23. * 输出: 转换完成的BCD码
  24. * 备注: unsigned char temp;
  25. unsigned char temp0;
  26. unsigned char temp10; 做数据计算的临时变量
  27. **************************************************************************************/
  28. unsigned char hex_to_bcd(unsigned char condata)
  29. {
  30. unsigned char temp;
  31. unsigned char temp0;
  32. unsigned char temp10;
  33. temp10=condata/10;
  34. temp0=condata%10;
  35. temp=(temp10<<4)|temp0;
  36. return(temp);
  37. }
  38. /*************************************************************************************
  39. * Function: bcd_to_hex
  40. * Object: BCD码转换成十六进制数
  41. * 输入: unsigned char condata需转换数据
  42. * 输出: 转换完成的BCD码
  43. * 备注: unsigned char temp;
  44. unsigned char temp0;
  45. unsigned char temp10; 做数据计算的临时变量
  46. **************************************************************************************/
  47. unsigned char bcd_to_hex(unsigned char condata)
  48. {
  49. unsigned char temp;
  50. unsigned char temp0;
  51. unsigned char temp10;
  52. temp10=(condata&0xF0)>>4;
  53. temp0=condata&0x0F;
  54. temp=temp10*10+temp0;
  55. return(temp);
  56. }
  57. /*************************************************************************************
  58. * Function: Read_Reg
  59. * Object: 读取FM31256寄存器
  60. * 输入: unsigned char addr, 读取地址 unsigned char *ucDataPtr 读取数据存储指针
  61. * 输出: 返回读取状态
  62. * 备注: unsigned char read_data=0xaa;读取数据
  63. unsigned char tempState = 0;状态值
  64. **************************************************************************************/
  65. unsigned char Read_Reg(unsigned char addr, unsigned char *ucDataPtr)
  66. {
  67. unsigned char read_data=0xaa;
  68. unsigned char tempState = 0;
  69. //启动
  70. if(RTC_START()!=RTC_READY)
  71. return 0;
  72. //TWI_START();
  73. //从机地址写入
  74. tempState = RTC_SendByte( Const_REG_ADDR + Const_IIC_WRITE );
  75. //tempState = TWI_SendByte( Const_REG_ADDR + Const_IIC_WRITE );
  76. if( 1 != tempState )
  77. {
  78. RTC_STOP(); //发送终止I2C标志
  79. //TWI_STOP();
  80. return( tempState );
  81. }
  82. //输出地址
  83. tempState = RTC_SendByte( addr );
  84. //tempState = TWI_SendByte( addr );
  85. if( 1 != tempState )
  86. {
  87. RTC_STOP(); //发送终止I2C标志
  88. //TWI_STOP();
  89. return( tempState );
  90. }
  91. //启动
  92. if(RTC_START()!=RTC_READY)
  93. return 0;
  94. //TWI_START();
  95. //从机地址写入
  96. tempState = RTC_SendByte( Const_REG_ADDR + Const_IIC_READ );
  97. //tempState = TWI_SendByte( Const_REG_ADDR + Const_IIC_READ );
  98. if( 1 != tempState )
  99. {
  100. RTC_STOP(); //发送终止I2C标志
  101. //TWI_STOP();
  102. return( tempState );
  103. }
  104. read_data = RTC_ReceiveByte();
  105. //read_data = TWI_ReceiveByte();
  106. RTC_STOP();
  107. //TWI_STOP();
  108. *ucDataPtr=read_data;
  109. return 1;
  110. }
  111. /*************************************************************************************
  112. * Function: Write_Reg
  113. * Object: 写FM31256寄存器
  114. * 输入: unsigned char addr, 写入地址 unsigned char data 写入数据
  115. * 输出: 返回写入状态
  116. * 备注: unsigned char tempState = 0;状态值
  117. **************************************************************************************/
  118. unsigned char Write_Reg(unsigned char addr,unsigned char data)
  119. {
  120. unsigned char tempState = 0;
  121. //启动
  122. if(RTC_START()!=RTC_READY)
  123. return 0;
  124. //TWI_START();
  125. //从机地址写入
  126. tempState = RTC_SendByte( Const_REG_ADDR + Const_IIC_WRITE );
  127. //tempState = TWI_SendByte( Const_REG_ADDR + Const_IIC_WRITE );
  128. if( 1 != tempState )
  129. {
  130. RTC_STOP(); //发送终止I2C标志
  131. //TWI_STOP();
  132. return( tempState );
  133. }
  134. //输出地址
  135. tempState = RTC_SendByte( addr );
  136. //tempState = TWI_SendByte( addr );
  137. if( 1 != tempState )
  138. {
  139. RTC_STOP(); //发送终止I2C标志
  140. //TWI_STOP();
  141. return( tempState );
  142. }
  143. //输出地址
  144. tempState = RTC_SendByte( data );
  145. //tempState = TWI_SendByte( data );
  146. if( 1 != tempState )
  147. {
  148. RTC_STOP(); //发送终止I2C标志
  149. //TWI_STOP();
  150. return( tempState );
  151. }
  152. RTC_STOP();
  153. //TWI_STOP();
  154. return 1;
  155. }
  156. /*********************************************************************************
  157. * Function: Read_FM31256RAM
  158. * Object: 单个读出RAM寄存器
  159. * 输入: RAM寄存器地址 ,读取数据存储指针
  160. * 输出: 无
  161. * 返回值: 1:读正常; 非1值:从机无应答
  162. * 备注: uint8_t tempState = 0;状态值
  163. uint8_t tempAddr = 0; 地址计算变量
  164. **********************************************************************************/
  165. uint8_t Read_FM31256RAM( uint16_t uiAddr , uint8_t *ucDataPtr )
  166. {
  167. uint8_t tempState = 0;
  168. uint8_t tempAddr = 0;
  169. //启动
  170. if( RTC_START() != RTC_READY )
  171. {
  172. return 0;
  173. }
  174. //从机地址写入
  175. tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_WRITE );
  176. if( 1 != tempState )
  177. {
  178. RTC_STOP(); //发送终止I2C标志
  179. return( tempState );
  180. }
  181. //输出地址
  182. tempAddr = ( uiAddr >> 8 ) & 0xff;//addr_h
  183. tempState = RTC_SendByte( tempAddr );
  184. if( 1 != tempState )
  185. {
  186. RTC_STOP(); //发送终止I2C标志
  187. return( tempState );
  188. }
  189. tempAddr = uiAddr & 0xff;//addr_l
  190. tempState = RTC_SendByte( tempAddr );
  191. if( 1 != tempState )
  192. {
  193. RTC_STOP(); //发送终止I2C标志
  194. return( tempState );
  195. }
  196. //启动
  197. if( RTC_START() != RTC_READY )
  198. {
  199. return 0;
  200. }
  201. //从机地址写入
  202. tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_READ );
  203. if( 1 != tempState )
  204. {
  205. RTC_STOP(); //发送终止I2C标志
  206. return( tempState );
  207. }
  208. *ucDataPtr = RTC_ReceiveByte();
  209. RTC_STOP();
  210. return 1;
  211. }
  212. /*********************************************************************************
  213. * Function: Read_Multi31256RAM
  214. * Object: 连续读出RAM寄存器
  215. * 输入: RAM寄存器地址
  216. * 输出: 无
  217. * 返回值: 1:读正常; 非1值:从机无应答
  218. * 备注: uint8_t tempState = 0;状态值
  219. uint8_t tempAddr = 0; 地址计算变量
  220. **********************************************************************************/
  221. uint8_t Read_Multi31256RAM( uint16_t uiAddr, uint8_t *ucDataBufPtr, uint16_t uiLen )
  222. {
  223. uint8_t tempState = 0;
  224. uint8_t tempAddr = 0;
  225. uint8_t iN = 0;
  226. //判断地址是否越界
  227. if( ( uiAddr + uiLen ) > MAX_31256RAM_ADDRESS )
  228. {
  229. return( 3 );
  230. }
  231. RTC_SendNACK(); //不发送应答
  232. RTC_STOP(); //发送终止I2C标志
  233. if( RTC_START() != RTC_READY ) //启动
  234. {
  235. return 0;
  236. }
  237. //从机地址写入
  238. tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_WRITE );
  239. if( 1 != tempState )
  240. {
  241. RTC_STOP(); //发送终止I2C标志
  242. return( tempState );
  243. }
  244. //输出地址
  245. tempAddr = ( uiAddr >> 8 ) & 0xff;//addr_h
  246. tempState = RTC_SendByte( tempAddr );
  247. if( 1 != tempState )
  248. {
  249. RTC_STOP(); //发送终止I2C标志
  250. return( tempState );
  251. }
  252. tempAddr = uiAddr & 0xff;//addr_l
  253. tempState = RTC_SendByte( tempAddr );
  254. if( 1 != tempState )
  255. {
  256. RTC_STOP(); //发送终止I2C标志
  257. return( tempState );
  258. }
  259. //启动
  260. if( RTC_START() != RTC_READY )
  261. {
  262. return 0;
  263. }
  264. //从机地址写入
  265. tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_READ );
  266. if( 1 != tempState )
  267. {
  268. RTC_STOP(); //发送终止I2C标志
  269. return( tempState );
  270. }
  271. for( iN = 0; iN < ( uiLen - 1 ); iN++ )
  272. {
  273. *( ucDataBufPtr+iN ) = RTC_ReceiveByte(); //读数据
  274. RTC_SendACK(); //发送应答
  275. }
  276. *( ucDataBufPtr + iN )=RTC_ReceiveByte(); //读数据
  277. RTC_SendNACK(); //最后一个字节不发送应答
  278. RTC_STOP();
  279. return 1;
  280. }
  281. /*********************************************************************************
  282. * Function: Write_FM31256RAM
  283. * Object: 单个写入RAM寄存器
  284. * 输入: RAM寄存器地址
  285. * 输出: 无
  286. * 返回值: 1:读正常; 非1值:从机无应答
  287. * 备注: uint8_t tempState = 0;状态值
  288. uint8_t tempAddr = 0; 地址计算变量
  289. **********************************************************************************/
  290. uint8_t Write_FM31256RAM( uint16_t uiAddr , uint8_t ucData )
  291. {
  292. uint8_t tempState = 0;
  293. uint8_t tempAddr = 0;
  294. //启动
  295. if( RTC_START() != RTC_READY )
  296. {
  297. return 0;
  298. }
  299. //从机地址写入
  300. tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_WRITE );
  301. if( 1 != tempState )
  302. {
  303. RTC_STOP(); //发送终止I2C标志
  304. return( tempState );
  305. }
  306. //输出地址
  307. tempAddr = ( uiAddr >> 8 ) & 0xff;//addr_h
  308. tempState = RTC_SendByte( tempAddr );
  309. if( 1 != tempState )
  310. {
  311. RTC_STOP(); //发送终止I2C标志
  312. return( tempState );
  313. }
  314. tempAddr = uiAddr & 0xff;//addr_l
  315. tempState = RTC_SendByte( tempAddr );
  316. if( 1 != tempState )
  317. {
  318. RTC_STOP(); //发送终止I2C标志
  319. return( tempState );
  320. }
  321. //写入单个数据
  322. tempState = RTC_SendByte( ucData );
  323. if( 1 != tempState )
  324. {
  325. RTC_STOP(); //发送终止I2C标志
  326. return( tempState );
  327. }
  328. RTC_STOP();
  329. return 1;
  330. }
  331. /*********************************************************************************
  332. * Function: Write_Multi31256RAM
  333. * Object: 连续写入RAM寄存器
  334. * 输入: RAM寄存器地址
  335. * 输出: 无
  336. * 返回值: 1:读正常; 非1值:从机无应答
  337. * 备注: uint8_t tempState = 0;状态值
  338. uint8_t tempAddr = 0; 地址计算变量
  339. **********************************************************************************/
  340. uint8_t Write_Multi31256RAM( uint16_t uiAddr , uint8_t *ucDataBufPtr , uint16_t uiLen )
  341. {
  342. uint8_t tempState = 0;
  343. uint8_t tempAddr = 0;
  344. uint8_t iN = 0;
  345. //判断地址是否越界
  346. if( ( uiAddr + uiLen ) > MAX_31256RAM_ADDRESS )
  347. {
  348. return( 3 );
  349. }
  350. RTC_SendNACK(); //不发送应答
  351. RTC_STOP(); //发送终止I2C标志
  352. if( RTC_START() != RTC_READY ) //启动
  353. {
  354. return 0;
  355. }
  356. //从机地址写入
  357. tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_WRITE );
  358. if( 1 != tempState )
  359. {
  360. RTC_STOP(); //发送终止I2C标志
  361. return( tempState );
  362. }
  363. //输出地址
  364. tempAddr = ( uiAddr >> 8 ) & 0xff;//addr_h
  365. tempState = RTC_SendByte( tempAddr );
  366. if( 1 != tempState )
  367. {
  368. RTC_STOP(); //发送终止I2C标志
  369. return( tempState );
  370. }
  371. tempAddr = uiAddr & 0xff;//addr_l
  372. tempState = RTC_SendByte( tempAddr );
  373. if( 1 != tempState )
  374. {
  375. RTC_STOP(); //发送终止I2C标志
  376. return( tempState );
  377. }
  378. //连续写入数据
  379. for( iN = 0 ; iN < uiLen; iN++ )
  380. {
  381. tempState = RTC_SendByte( *( ucDataBufPtr + iN ) );
  382. if( 1 != tempState )
  383. {
  384. RTC_STOP(); //发送终止I2C标志
  385. return( tempState );
  386. }
  387. }
  388. RTC_STOP(); //发送终止I2C标志
  389. return(1);
  390. }
  391. /*********************************************************************************
  392. * Function: InitRtc
  393. * Object: FM31256初始化
  394. * 输入: 无
  395. * 输出: 无
  396. * 备注: 可初始化时间及工作电压
  397. **********************************************************************************/
  398. void InitRtc(void)
  399. {
  400. Write_Reg(Const_CONTROL,0);
  401. //Write_Reg(0,2);//??
  402. Write_Reg(Const_YEAR,hex_to_bcd(13));
  403. Write_Reg(Const_MONTH,hex_to_bcd(8));
  404. Write_Reg(Const_DATE,hex_to_bcd(26));
  405. Write_Reg(Const_WEEK,hex_to_bcd(3));
  406. Write_Reg(Const_HOURS,hex_to_bcd(13));
  407. Write_Reg(Const_MINUTES,hex_to_bcd(13));
  408. Write_Reg(Const_SECONDS,hex_to_bcd(15));
  409. //Write_Reg(0,0);//????
  410. //Write_Reg(1,0);
  411. //Write_Reg(Const_COMPANION,1);//无保护、充电(7)无充电(3)、复位电压4.4V
  412. }
  413. /*********************************************************************************
  414. * Function: GetCurDateTimeFromRTC
  415. * Object: 获取当前时间
  416. * 输入: 无
  417. * 输出: 无
  418. * 备注: uint8_t ucTimeBuf[8];
  419. uint8_t ucTempTime = 0; 读取时间计算变量
  420. **********************************************************************************/
  421. void GetCurDateTimeFromRTC( void )
  422. {
  423. uint8_t ucTimeBuf[8];
  424. uint8_t ucTempTime = 0;
  425. RTC_STOP();
  426. //Write_Reg(0,1);
  427. // Read_Reg(Const_SECONDS,&ucTimeBuf[0]);
  428. Read_Reg(Const_MINUTES,&ucTimeBuf[1]);
  429. Read_Reg(Const_HOURS,&ucTimeBuf[2]);
  430. // Read_Reg(Const_WEEK,&ucTimeBuf[3]);
  431. Read_Reg(Const_DATE,&ucTimeBuf[4]);//Const_DAY
  432. Read_Reg(Const_MONTH,&ucTimeBuf[5]);
  433. Read_Reg(Const_YEAR,&ucTimeBuf[6]);
  434. //Write_Reg(0,0);
  435. ucTempTime = bcd_to_hex(ucTimeBuf[6]);
  436. if( ucTempTime >= 15 && ucTempTime <= 99 )
  437. {
  438. displayTimeBuf.year = ucTempTime + 2000;
  439. }
  440. ucTempTime = (bcd_to_hex(ucTimeBuf[5]) & 0x1f);
  441. if( ucTempTime >= 1 && ucTempTime <= 12 )
  442. {
  443. displayTimeBuf.month = ucTempTime;
  444. }
  445. ucTempTime = (bcd_to_hex(ucTimeBuf[4]) & 0x3f);
  446. if( ucTempTime >= 1 && ucTempTime <= 31 )
  447. {
  448. displayTimeBuf.date = ucTempTime;
  449. }
  450. ucTempTime = ( bcd_to_hex(ucTimeBuf[2]) & 0x3f);
  451. if( ucTempTime <= 23 )
  452. {
  453. displayTimeBuf.hour = ucTempTime;
  454. }
  455. ucTempTime = (bcd_to_hex(ucTimeBuf[1])& 0x7f);
  456. if( ucTempTime <= 59 )
  457. {
  458. displayTimeBuf.minute = ucTempTime;
  459. }
  460. ucTempTime = (bcd_to_hex(ucTimeBuf[0]) & 0x7f);
  461. if( ucTempTime <= 59 )
  462. {
  463. displayTimeBuf.seconds = ucTempTime;
  464. }
  465. }
  466. /*********************************************************************************
  467. * Function: SetDateTimeToRTC
  468. * Object: 向FM31256设置时间
  469. * 输入: 无
  470. * 输出: 无
  471. * 备注: 根据displayTimeBuf结构体的数据向FM31256设置时间
  472. **********************************************************************************/
  473. void SetDateTimeToRTC( void )
  474. {
  475. if( displayTimeBuf.year < 2021 )
  476. {
  477. displayTimeBuf.year = 2021;
  478. }
  479. /* Write_Reg(0,0);
  480. Write_Reg(0,2);//使能*/
  481. Write_Reg(Const_CONTROL,0);
  482. //Write_Reg(0,2);//使能*/
  483. Write_Reg(Const_YEAR,hex_to_bcd(displayTimeBuf.year - 2000));
  484. Write_Reg(Const_MONTH,(hex_to_bcd(displayTimeBuf.month) & 0x1f));
  485. Write_Reg(Const_DATE,(hex_to_bcd(displayTimeBuf.date) & 0x3f));
  486. Write_Reg(Const_HOURS,(hex_to_bcd(displayTimeBuf.hour) & 0x3f));
  487. Write_Reg(Const_MINUTES,(hex_to_bcd(displayTimeBuf.minute) & 0x7f));
  488. Write_Reg(Const_SECONDS,(hex_to_bcd(displayTimeBuf.seconds) & 0x7f));
  489. //Write_Reg(0,0);//关闭读写
  490. Write_Reg(Const_FLAGS,0);
  491. }