查看: 12015|回复: 14

[原创] 【LPC54114】+ A4.硬件I2C驱动OLED及温湿度计SHT20

[复制链接]
  • TA的每日心情
    开心
    2025-5-29 08:54
  • 签到天数: 2992 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    45

    主题

    5548

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    12035
    最后登录
    2025-5-29
    发表于 2017-4-10 21:56:18 | 显示全部楼层 |阅读模式
    上一篇【LPC54114】+ A3.硬件SPI驱动OLED我们通过SPI接口的操作成功的驱动了OLED,本来打算也用I2C来试试的没想到楼主先前给自己埋了一个大坑所以今天才搞定了。怎么回事呢,如下图所示,这块0.91英寸的oled屏幕转接板是手工做的,当时一不留神忘记上拉了,只得手动飞线给接上。可能时间长了有点儿接触不良,还一直以为是I2C配置的问题波形出不来。

    IMG_20170410_195748.jpg
    今天按照官方的例程来一步步配置下来还是不行,最后连逻辑分析仪都用上了发现时钟线一直是低电平,有猫腻。
    尝试用P0_23 P0_24这两个端口来点个灯发现也是不行,最后求助了小伙伴。他加了一个4.7k的上拉电阻居然就可以了,我也是醉了。最后我才发现是我硬件的问题,重新焊接了上拉电阻为了保险起见还给打了胶这下应该不会再出现bug了。

    QQ截图20170410212836.jpg
    QQ截图20170410212914.jpg

    这块板卡预留的arduino接口的I2C没有上拉,千万记得上拉、千万记得上拉、千万记得上拉,重要的事情BB三遍。
    而且从数据手册得知刚好这组接口是不能设置内部上拉的,还真的是凑巧啊。

    QQ截图20170410213700.jpg
    QQ截图20170410213724.jpg
    QQ截图20170410213739.jpg
    找到了问题就简单多了,又把先前的温湿度计给接上了,官方库I2C用的7bit地址请注意。
    1. void I2C_oled_Init(void)
    2. {
    3.         i2c_master_config_t masterConfig;
    4.         
    5.         CLOCK_AttachClk(kFRO_HF_to_FLEXCOMM1);
    6.         RESET_PeripheralReset(kFC1_RST_SHIFT_RSTn);
    7.         
    8.         IOCON_PinMuxSet(IOCON, 0, 23, 0x181);
    9.         IOCON_PinMuxSet(IOCON, 0, 24, 0x181);
    10.         

    11.         I2C_MasterGetDefaultConfig(&masterConfig);
    12.         masterConfig.baudRate_Bps = 100000U;
    13.         masterConfig.enableMaster = 1;
    14.         I2C_MasterInit(I2C1, &masterConfig, 12000000);
    15. }
    复制代码
    1. status_t I2C_oled_exchange(uint8_t control,uint8_t senddata)
    2. {
    3.         uint8_t buf[2] = { control, senddata };
    4.         
    5.         I2C_MasterStart(I2C1, OLED_I2C_ADDRESS_7BIT, kI2C_Write);
    6.         I2C_MasterWriteBlocking(I2C1, &buf, 2, 0);
    7.         I2C_MasterStop(I2C1);
    8.         return 1;
    9. }
    复制代码
    1. int main(void)
    2. {
    3. //        char ch;
    4. //        uint16_t wADCValue = 0;

    5. //        uint8_t ret;

    6.         /* Init board hardware. */
    7.         /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
    8.         CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);

    9.         BOARD_InitPins();
    10.         BOARD_BootClockRUN();
    11.         BOARD_InitDebugConsole();
    12.         
    13.         SystemCoreClockUpdate();
    14.         
    15.         SysTick_Config(SystemCoreClock/1000);
    16.         
    17.         PRINTF("\r\n-------------------------------\r\n\r\n");
    18.         PRINTF("hello world.\r\n");
    19.         PRINTF("LPC54110 Sys Clock is %dMhz.\r\n", SystemCoreClock/1000000);
    20.         PRINTF("\r\n-------------------------------\r\n");

    21.   CLOCK_EnableClock(kCLOCK_InputMux);
    22.   CLOCK_EnableClock(kCLOCK_Iocon);
    23.   CLOCK_EnableClock(kCLOCK_Gpio0);
    24.   CLOCK_EnableClock(kCLOCK_Gpio1);
    25.         
    26. //        HC595Init();
    27. //        SPI_oled_Init();
    28.         I2C_oled_Init();
    29.         led_init();
    30. //        key_init();
    31.         
    32.         HAL_Delay(10);        
    33.   OLED_Init();        
    34.   OLED_Clear();

    35.         HAL_Delay(500);

    36.         SHT20_Soft_Reset();
    37.         value1 = SHT20_Read_Register();
    38.         while(value1 == 0)
    39.         {
    40.                 SHT20_Soft_Reset();
    41.         }
    42.         SHT20_Write_Register((value1 & 0x7e) | 0x80);
    43.         value2 = SHT20_Read_Register();
    44.         sprintf(str4, "val = 0x%02X 0x%02X", value1,value2);
    45.         OLED_ShowString(0, 0, str4, 8);
    46.         while (1)
    47.         {
    48.                 temp = SHT20_Read_value(Trigger_T_measuremnet_hold_master);
    49.                 temp &= ~0x0003;

    50.                 real_value = -46.85 + 175.72 / 65536 * temp;

    51.                 sprintf(str4, "T  = %2.4f C ", real_value);
    52.                 OLED_ShowString(0, 1, str4, 8);
    53.                         
    54.                 temp = SHT20_Read_value(Trigger_RH_measuremnet_hold_master);
    55.                 temp &= ~0x0003;

    56.                 real_value = -6.0 + 125.0 / 65536 * temp;

    57.                 sprintf(str4, "RH = %2.4f RH ", real_value);
    58.                 OLED_ShowString(0, 2, str4, 8);
    59.         }
    60. }
    复制代码
    有时候真是细节决定成败,虽然时刻要求自己的在设计电路要细心细心不过难免有时候还是出现了各种各样的问题。谨以此篇文章纪念逝去的两三天时间说多了都是泪啊。
    最后上一张显示温湿度的图片,外边下雨呢湿度有点大。
    IMG_20170410_211858.jpg

    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7879
    最后登录
    2025-4-11
    发表于 2017-4-11 09:32:46 | 显示全部楼层
    6                                                                  
    来根华子
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    35

    帖子

    0

    注册会员

    Rank: 2

    积分
    157
    最后登录
    2022-7-6
    发表于 2017-4-11 18:33:03 | 显示全部楼层
    厉害的不要不要的~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-29 08:54
  • 签到天数: 2992 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    45

    主题

    5548

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    12035
    最后登录
    2025-5-29
     楼主| 发表于 2017-4-12 11:00:15 | 显示全部楼层

    都是泪啊。。。
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-29 08:54
  • 签到天数: 2992 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    45

    主题

    5548

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    12035
    最后登录
    2025-5-29
     楼主| 发表于 2017-4-12 11:00:30 | 显示全部楼层
    caizhiwei 发表于 2017-4-11 18:33
    厉害的不要不要的~~~

    谢谢支持。
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2019-4-15 10:05
  • 签到天数: 98 天

    连续签到: 1 天

    [LV.6]常住居民II

    6

    主题

    579

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1787
    最后登录
    2025-3-5
    发表于 2017-4-26 13:19:34 | 显示全部楼层
    谢谢 分享           
    打卡打卡!今天天气不好!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    61

    主题

    233

    帖子

    7

    高级会员

    Rank: 4

    积分
    750
    最后登录
    2021-1-25
    发表于 2017-9-14 15:01:27 | 显示全部楼层
    没有没看到何时调用I2C_oled_exchange这个函数
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-9-15 08:42
  • 签到天数: 1952 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    1

    主题

    4686

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9405
    最后登录
    2023-9-15
    发表于 2017-9-14 20:59:48 | 显示全部楼层
    谢谢分享!
    今天天气不错!签到!
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    5 小时前
  • 签到天数: 1972 天

    连续签到: 22 天

    [LV.Master]伴坛终老

    4

    主题

    8947

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13930
    最后登录
    2025-7-21
    发表于 2017-11-15 09:05:48 | 显示全部楼层
    不错不错啊。。。。。。。。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    6 小时前
  • 签到天数: 1779 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    54

    主题

    4379

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    9184
    最后登录
    2025-7-21
    发表于 2017-12-5 15:48:47 | 显示全部楼层
    写得不错,看看,学习下。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 16:42 , Processed in 0.107574 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表