玩转MAX32660-EVSYS开发板及ADXL345传感器(Funpack第六期)
使用MAX32660开发板,在两个I2C接口分别连接ADXL345及OLED显示屏,实现了倾角测量及显示、时间显示灯功能。
标签
嵌入式系统
Funpack
MAX32660
OLED
ADXL345
chinaking
更新2021-03-31
875

玩转MAX32660开发板

一、硬件

开发板:MAX32660

FsUGkpqsygL65HEu9npPUNxSEiZs

传感器:ADXL345 检测3轴加速度/角度

显示屏:OLED显示屏 0.96寸

接线:开发板I2C0(P0_8, P0_9)------ ADXL345

      开发板I2C1(P0_2, P0_3)------ OLED

      注意:开发板跳线选到3.3V

            ADXL345 CS脚-----3.3V

                    SDO脚-----GND(也可接3.3V,但会影响读写地址)

 

二、开发环境

Keil5

三、功能

时间显示

倾角显示

四、关键代码

显示屏驱动 oled.c

//初始化命令
unsigned char bufInit[LEN27]={
  0xAE, 0x00, 0x10, 0x40, 0xB0, 0x81, 0xFF, 0xA1, 0xA6, 0xA8, 0x3F,
  0xC8, 0xD3, 0x00, 0xD5, 0x80, 0xD8, 0x05, 0xD9, 0xF1, 0xDA, 0x12,
  0xD8, 0x30, 0x8D, 0x14, 0xAF};

//初始化批量命令
void OLED_WR_InitCmd()
  {
       /*
       uint8_t i = 0;
            for(i=0; i<27; i++){
                   OLED_WR_CMD(bufInit[i]);
            }
        */
        I2C_MasterWrite(MXC_I2C1, OLED_I2C_ADDR, bufInit, 27, 0);
  }

  //向设备写控制命令
void OLED_WR_CMD(uint8_t cmd)
  {
         unsigned char buf[2]={0x00,cmd};
         I2C_MasterWrite(MXC_I2C1, OLED_I2C_ADDR, buf, 2, 0);
  }

  //向设备写数据
void OLED_WR_DATA(uint8_t data)
  {
         unsigned char buf[2]={0x40,data};
         I2C_MasterWrite(MXC_I2C1, OLED_I2C_ADDR,  buf, 2, 0);
  }

 

传感器驱动 adxl345.c

//初始化ADXL345.

//返回值:0,初始化成功;1,初始化失败.

uint8_t ADXL345_Init(void)
{                
    I2C_Init(MXC_I2C0, I2C_STD_MODE, NULL);                     //初始化IIC总线        
    if(ADXL345_RD_Reg(DEVICE_ID)==0XE5) //读取器件ID
    { 
        ADXL345_WR_Reg(DATA_FORMAT,0X2B);   //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程
        ADXL345_WR_Reg(BW_RATE,0x0A);       //数据输出速度为100Hz
        ADXL345_WR_Reg(POWER_CTL,0x28);     //链接使能,测量模式
        ADXL345_WR_Reg(INT_ENABLE,0x00);    //不使用中断     
        ADXL345_WR_Reg(OFSX,0x00);
        ADXL345_WR_Reg(OFSY,0x00);
        ADXL345_WR_Reg(OFSZ,0x00); 
        return 0;
    }          
    return 1;                                    
}



//IIC连续写
//addr:器件地址
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
//    其他,错误代码

uint8_t ADXL345_Write_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf){
       uint8_t txdata[16],error;
       uint8_t i;
       txdata[0]=reg;
       for(i=1;i<len+1;i++){
              txdata[i]=buf[i-1];
       }
       error=I2C_MasterWrite(MXC_I2C0, (addr<<1)|0, txdata, len+1, 0);
       return error-(len+1);
}

//IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
//    其他,错误代码

uint8_t ADXL345_Read_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf){
       uint8_t res;
       I2C_MasterWrite(MXC_I2C0, (addr<<1)|0, &reg, 1, 0);   
       //printf("read reg=%x    len=%d    %d\n",(addr<<1)|0,len,res);
      //return I2C_MasterRead(MXC_I2C0, (addr<<1)|1, buf, len, 0);
       res=I2C_MasterRead(MXC_I2C0, (addr<<1)|1, buf, len, 0);
       //printf("read len=%d\n",res);
       return res-len;
    


//IIC写一个字节
//reg:寄存器地址
//data:数据
//返回值:0,正常
//    其他,错误代码

uint8_t ADXL345_WR_Reg(uint8_t reg,uint8_t data){
       uint16_t error;
       uint8_t txdata[2];
       txdata[0]=reg;
       txdata[1]=data;
       error=I2C_MasterWrite(MXC_I2C0, ADXL_WRITE, txdata, 2, 0);
       //printf("IIC write reg=%x  echo=%d \n",reg,error);
       return error-2;
}

//IIC读一个字节
//reg:寄存器地址
//返回值:读到的数据

uint8_t ADXL345_RD_Reg(uint8_t reg){
       uint8_t data;
       data=reg;
       I2C_MasterWrite(MXC_I2C0, ADXL_WRITE, &data, 1, 0);
       //printf("IIC write leng=%d\n",error);
       I2C_MasterRead(MXC_I2C0, ADXL_READ, &data, 1, 0);
       //printf("IIC read leng=%d\n",error);
       return data;

}

 

注意:ADXL_READ和ADXL_WRITE的值,

      当ADXL345的SDO脚(12脚)接地时,传感器I2C地址addr是0X53,

读地址为(addr<<1)|1  即  0XA7,

写地址为(addr<<1)|0 即  0XA6,

因此,在adxl345.h做如下宏定义

#define ADXL_ADDR    0X53

#define ADXL_READ    0XA7

#define ADXL_WRITE   0XA6

同理,若ADXL345的SDO脚(12脚)接VCC时,传感器I2C地址addr是0X1D,此时

#define ADXL_ADDR    0X1D

#define ADXL_READ    0X3B

#define ADXL_WRITE   0X3A

 

main.c

int main()
{
         while(ADXL345_Init())
    {
        printf("ADXL345 Error!\r\n");
       // LCD_ShowString(130,50,tftlcd_data.width,tftlcd_data.height,16,"Error  ");
        delay_ms(200);
    }
    printf("ADXL345 OK!\r\n");    
         I2C_Init(MXC_I2C1, I2C_STD_MODE, NULL);
         OLED_Init();
         OLED_Clear();

              OLED_ShowString(5, 10, "Time",16);
              OLED_ShowString(62, 10, ":",16);
              OLED_ShowString(84, 10, ":",16);
              OLED_ShowString(5, 12, "AngX",16);
              OLED_ShowString(5, 14, "AngY",16);

              uint8_t seconds;
              uint8_t minute;
              uint8_t hour;
              uint16_t i;
              uint16_t j;
              while(1)
              {                  
           for(hour=0; hour<24; hour++){
                 for(minute=0; minute<60; minute++){
                        for(seconds=0; seconds<60; seconds++){                         
                              data_pros();                                     
                              OLED_ShowNum(46, 2,hour,2, 16); // 时     
                              OLED_ShowNum(68, 2,minute,2, 16); // 分
                              OLED_ShowNum(92, 2,seconds,2, 16); //秒

                               OLED_ShowNum(68, 4,Angle_X,2, 16); //X
                               OLED_ShowNum(68, 6,Angle_Y,2, 16); //Y
                               delay_ms(1000);
                                        }
                                  }
                            }            
              }  
}

五、心得体会

嵌入式开发需要很大的耐心、细心,经过这几期funpack,越来越认识到,嵌入式开发就是磨砺心性的过程。网上资料非常丰富,交流群网友的热心解答,大大提高了开发进度。

 

附件下载
03-funpack第6期 MAX32660代码 ADXL345_OLED_keil.rar
02-funpack第6期 MAX32660开发说明文档 老胡.docx
团队介绍
老胡,自动化工程师,业余嵌入式初级玩家。
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号