在线时间7188 小时
UID3426478
注册时间2017-9-25
NXP金币5008
TA的每日心情 | 擦汗 1 小时前 |
---|
签到天数: 1847 天 连续签到: 2 天 [LV.Master]伴坛终老
超级版主
 
- 积分
- 112625
- 最后登录
- 2025-7-20
|
本帖最后由 stm1024 于 2018-11-16 21:33 编辑
I2C从设备采用的是DS3231,一款时钟芯片,之前在某宝上买的一个模块,从51时就玩过。
以前在STM32上玩硬件I2C,总会出现这样或者那样的问题,怀疑官方库有点问题,然后Reference Manual也没写完整。
这次在LPC上用硬件搞I2C,我倒没有太担心,比较这个协议可是nxp家自己搞出来的,如果自己都搞不好,肯定糗大了。
首先,要具备协议本身的知识,重点是看手册上关于状态的说明,这个玩意儿才靠谱,说明了芯片的状态,以及你接下来应该做的事情。
其他的我就不截图了。
LPCOpen的类库当然没问题,但是并不能说明根本问题,学习就要搞清楚每一步的流程和寄存器的状态,于是自己又撸了一下驱动代码。
主程序:
- int main()
- {
- uint8_t sec,min,hour;
-
- Board_Init();
-
- I2C0_Init();
- I2C0_WriteData(DS3231ADDR,0x02,9);//write hour
- while(1)
- {
- sec=I2C0_ReadData(DS3231ADDR,0x00);
- min=I2C0_ReadData(DS3231ADDR,0x01);
- hour=I2C0_ReadData(DS3231ADDR,0x02);
- hour=(hour)&0x1f;
- hour=(hour>>4)*10+(hour&0x0f);
- printf("%02d:%02x:%02x\r\n",hour,min,sec);
- Delay_ms(997);
- }
- //return 0;
- }
复制代码 运行结果:
借用了LPCOpen上的USART0输出。以上代码也只是想说明流程,没想过去优化或者容错,例如一旦出现从机掉线或者故障,代码就会卡死等,
这些都是在实际应用中要慎重考虑的事情。
后面再研究一下状态值,把多字节读写也试试。
|
|