这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【“Let'sdo活动"】"智能手环DIY活动过程帖-OLED,MAX30102

共1条 1/1 1 跳转至

【“Let'sdo活动"】"智能手环DIY活动过程帖-OLED,MAX30102驱动

菜鸟
2025-10-11 22:19:49     打赏

之前一直使用keil开发单片机,主要以stm32为主。借着这次活动,想接触一下开源工具链的使用。搜索了下相关博客和视频,最后决定先采用VSCODE进行开发。好在本次活动提供的开发工具例程中就可以直接使用VSCODE,省去了不少学习成本。

首先进行OLED的移植。在移植过程中,遇见了一个大坑,排查了几个小时,把所有代码写完后,发现OLED无论如何都不亮,中间排查了上拉电阻,信号波形,电源供电,导通性等等,最后发现是杜邦线接触不好,太松了。后来把杜邦线的头弄紧了以后就好了。这种接插件的可靠性太差了,还是要买质量好的,或者换一种连接可靠的方式才行。

OLED的移植我是参考【分享开发笔记,赚取电动螺丝刀】移植U8g2到MAX78000开发板,使用模拟i2c-电子产品世界论坛,这篇帖子,不一样的地方我贴在下面,供参考。这里用的是模拟IIC,P2.3和2.4引脚。因为是用3.3V电平驱动OLED,所以这里要改为VDDIOH。

#include "mxc_device.h"  
#include "mxc_delay.h"  
#include "gpio.h"  
#include "u8g2.h"  
#include "u8x8.h" 
#include "asc.h"   
#include "max78000_u8g2.h" 
 
void IIC_Init(void)
{
    mxc_gpio_cfg_t gpio_out;  
    /* Setup output pin. */  
    gpio_out.port = MXC_GPIO_PORT_SDA;  
    gpio_out.mask = MXC_GPIO_PIN_SDA;  
    gpio_out.pad =     MXC_GPIO_PAD_NONE;
    gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;
    gpio_out.drvstr=MXC_GPIO_DRVSTR_0;
    gpio_out.func = MXC_GPIO_FUNC_OUT;  
    MXC_GPIO_Config(&gpio_out);  
    gpio_out.port = MXC_GPIO_PORT_SCL;  
    gpio_out.mask = MXC_GPIO_PIN_SCL;  
    gpio_out.pad =     MXC_GPIO_PAD_NONE;
    gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;
    gpio_out.drvstr=MXC_GPIO_DRVSTR_0;
    gpio_out.func = MXC_GPIO_FUNC_OUT;  
    MXC_GPIO_Config(&gpio_out);  
}
uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    switch (msg)
    {
    case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds
        __NOP();
        break;
    case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro seconds
       MXC_Delay(10);
        break;
    case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second

        break;
    case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
        /* arg_int is 1 or 4: 100KHz (5us) or 400KHz (1.25us) */  
        MXC_Delay(5);   //微秒延时 
        break;                    // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
    case U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pin
                if(arg_int == 0)
                {
                    //MXC_GPIO_OutSet(MXC_GPIO_PORT_SCL, MXC_GPIO_PIN_SCL);  // 高电平  
                    MXC_GPIO_OutClr(MXC_GPIO_PORT_SCL, MXC_GPIO_PIN_SCL);  // 低电平  
                } else if(arg_int == 1){  
                    MXC_GPIO_OutSet(MXC_GPIO_PORT_SCL, MXC_GPIO_PIN_SCL);  // 高电平  
                    //MXC_GPIO_OutClr(MXC_GPIO_PORT_SCL, MXC_GPIO_PIN_SCL);  // 低电平  
                }
                break; // arg_int=1: Input dir with pullup high for I2C clock pin

    case U8X8_MSG_GPIO_I2C_DATA:  // arg_int=0: Output low at I2C data pin
                if(arg_int == 0)
                {
                    //MXC_GPIO_OutSet(MXC_GPIO_PORT_SDA, MXC_GPIO_PIN_SDA);  // 高电平  
                    MXC_GPIO_OutClr(MXC_GPIO_PORT_SDA, MXC_GPIO_PIN_SDA);  // 低电平  
                } else if(arg_int == 1){  
                    MXC_GPIO_OutSet(MXC_GPIO_PORT_SDA, MXC_GPIO_PIN_SDA);  // 高电平  
                    //MXC_GPIO_OutClr(MXC_GPIO_PORT_SDA, MXC_GPIO_PIN_SDA);  // 低电平  
                }  
                break;                    // arg_int=1: Input dir with pullup high for I2C data pin
    case U8X8_MSG_GPIO_MENU_SELECT:
        u8x8_SetGPIOResult(u8x8,/* get menu select pin state */ 0);
        break;
    case U8X8_MSG_GPIO_MENU_NEXT:
        u8x8_SetGPIOResult(u8x8,/* get menu next pin state */  0);
        break;
    case U8X8_MSG_GPIO_MENU_PREV:
        u8x8_SetGPIOResult(u8x8,/* get menu prev pin state */  0);
        break;
    case U8X8_MSG_GPIO_MENU_HOME:
        u8x8_SetGPIOResult(u8x8,/* get menu home pin state */  0);
        break;
       
    default:
        u8x8_SetGPIOResult(u8x8, 1); // default return value
        break;
    }
    return 1;
}
void u8g2Init(u8g2_t *u8g2)
{

    u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay); 
    u8g2_InitDisplay(u8g2);                                                                        
    u8g2_SetPowerSave(u8g2, 0);                                                                    
    u8g2_ClearBuffer(u8g2);
    u8g2_SetFontMode(u8g2, 1); 
    u8g2_SetFontDirection(u8g2, 0); 
    u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);
}
/***** Includes *****/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "board.h"
#include "mxc_device.h"
#include "mxc_delay.h"
#include "max7800_u8g2.h"
#include "nvic_table.h"
#include "pb.h"
#include "gpio.h"  
#include "u8g2.h"  
 
/***** Definitions *****/
  
#define MXC_GPIO_PORT_OUT MXC_GPIO2  
#define MXC_GPIO_PIN_OUT  MXC_GPIO_PIN_0

/***** Globals *****/


/***** Functions *****/


u8g2_t u8g2; 
int main(void)
{
    mxc_gpio_cfg_t gpio_out;  
    MXC_Delay(1000000);  
    IIC_Init(); //Init I2C pins
    u8g2Init(&u8g2);  
    draw(&u8g2); 
    /* Setup output pin. */  
    gpio_out.port = MXC_GPIO_PORT_OUT;  
    gpio_out.mask = MXC_GPIO_PIN_OUT;  
    gpio_out.pad = MXC_GPIO_PAD_NONE;  
    gpio_out.func = MXC_GPIO_FUNC_OUT;  
    MXC_GPIO_Config(&gpio_out);  
  
    //u8g2_SetFont(&u8g2, u8g2_font_smart_patrol_nbp_tr);  
    u8g2_ClearBuffer(&u8g2);
    u8g2_SetFontRefHeightText(&u8g2);  
    u8g2_SetFontPosTop(&u8g2);  
    u8g2_DrawStr(&u8g2, 0, 30, "u8g2 Soft I2C");  
    u8g2_SendBuffer(&u8g2);  
  //draw(&u8g2);
    while (1) {  
        MXC_GPIO_OutSet(gpio_out.port, gpio_out.mask);   
        MXC_Delay(5000000);  
        MXC_GPIO_OutClr(gpio_out.port, gpio_out.mask);  
        MXC_Delay(5000000);  
    }  
  
    return 0;  
}

image.png

max30102驱动资源比较多,这里就不在展示了。这里做了一个转接板,手指放上去后实现了原始数据的读取。

image.png

image.png

后面就是算法的处理和后续OLED数据显示的工作了,期待成果贴吧!



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]