在线时间1258 小时
UID3174487
注册时间2015-10-31
NXP金币2015
TA的每日心情 | 开心 2025-5-29 08:54 |
---|
签到天数: 2992 天 连续签到: 8 天 [LV.Master]伴坛终老
金牌会员
 
- 积分
- 12035
- 最后登录
- 2025-5-29
|
上一篇【LPC54114】+ A3.硬件SPI驱动OLED我们通过SPI接口的操作成功的驱动了OLED,本来打算也用I2C来试试的没想到楼主先前给自己埋了一个大坑所以今天才搞定了。  怎么回事呢,如下图所示,这块0.91英寸的oled屏幕转接板是手工做的,当时一不留神忘记上拉了,只得手动飞线给接上。可能时间长了有点儿接触不良,还一直以为是I2C配置的问题波形出不来。
今天按照官方的例程来一步步配置下来还是不行,最后连逻辑分析仪都用上了发现时钟线一直是低电平,有猫腻。
尝试用P0_23 P0_24这两个端口来点个灯发现也是不行,最后求助了小伙伴。他加了一个4.7k的上拉电阻居然就可以了,我也是醉了。最后我才发现是我硬件的问题,重新焊接了上拉电阻为了保险起见还给打了胶这下应该不会再出现bug了。
这块板卡预留的arduino接口的I2C没有上拉,千万记得上拉、千万记得上拉、千万记得上拉,重要的事情BB三遍。
而且从数据手册得知刚好这组接口是不能设置内部上拉的,还真的是凑巧啊。
找到了问题就简单多了,又把先前的温湿度计给接上了,官方库I2C用的7bit地址请注意。
- void I2C_oled_Init(void)
- {
- i2c_master_config_t masterConfig;
-
- CLOCK_AttachClk(kFRO_HF_to_FLEXCOMM1);
- RESET_PeripheralReset(kFC1_RST_SHIFT_RSTn);
-
- IOCON_PinMuxSet(IOCON, 0, 23, 0x181);
- IOCON_PinMuxSet(IOCON, 0, 24, 0x181);
-
- I2C_MasterGetDefaultConfig(&masterConfig);
- masterConfig.baudRate_Bps = 100000U;
- masterConfig.enableMaster = 1;
- I2C_MasterInit(I2C1, &masterConfig, 12000000);
- }
复制代码- status_t I2C_oled_exchange(uint8_t control,uint8_t senddata)
- {
- uint8_t buf[2] = { control, senddata };
-
- I2C_MasterStart(I2C1, OLED_I2C_ADDRESS_7BIT, kI2C_Write);
- I2C_MasterWriteBlocking(I2C1, &buf, 2, 0);
- I2C_MasterStop(I2C1);
- return 1;
- }
复制代码- int main(void)
- {
- // char ch;
- // uint16_t wADCValue = 0;
- // uint8_t ret;
- /* Init board hardware. */
- /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
- CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- BOARD_InitPins();
- BOARD_BootClockRUN();
- BOARD_InitDebugConsole();
-
- SystemCoreClockUpdate();
-
- SysTick_Config(SystemCoreClock/1000);
-
- PRINTF("\r\n-------------------------------\r\n\r\n");
- PRINTF("hello world.\r\n");
- PRINTF("LPC54110 Sys Clock is %dMhz.\r\n", SystemCoreClock/1000000);
- PRINTF("\r\n-------------------------------\r\n");
- CLOCK_EnableClock(kCLOCK_InputMux);
- CLOCK_EnableClock(kCLOCK_Iocon);
- CLOCK_EnableClock(kCLOCK_Gpio0);
- CLOCK_EnableClock(kCLOCK_Gpio1);
-
- // HC595Init();
- // SPI_oled_Init();
- I2C_oled_Init();
- led_init();
- // key_init();
-
- HAL_Delay(10);
- OLED_Init();
- OLED_Clear();
- HAL_Delay(500);
- SHT20_Soft_Reset();
- value1 = SHT20_Read_Register();
- while(value1 == 0)
- {
- SHT20_Soft_Reset();
- }
- SHT20_Write_Register((value1 & 0x7e) | 0x80);
- value2 = SHT20_Read_Register();
- sprintf(str4, "val = 0x%02X 0x%02X", value1,value2);
- OLED_ShowString(0, 0, str4, 8);
- while (1)
- {
- temp = SHT20_Read_value(Trigger_T_measuremnet_hold_master);
- temp &= ~0x0003;
- real_value = -46.85 + 175.72 / 65536 * temp;
- sprintf(str4, "T = %2.4f C ", real_value);
- OLED_ShowString(0, 1, str4, 8);
-
- temp = SHT20_Read_value(Trigger_RH_measuremnet_hold_master);
- temp &= ~0x0003;
- real_value = -6.0 + 125.0 / 65536 * temp;
- sprintf(str4, "RH = %2.4f RH ", real_value);
- OLED_ShowString(0, 2, str4, 8);
- }
- }
复制代码 有时候真是细节决定成败,虽然时刻要求自己的在设计电路要细心细心不过难免有时候还是出现了各种各样的问题。谨以此篇文章纪念逝去的两三天时间说多了都是泪啊。
最后上一张显示温湿度的图片,外边下雨呢湿度有点大。
|
|