内容介绍
内容介绍
玩转MAX32660开发板
一、硬件
开发板:MAX32660
传感器: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, ®, 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
查看更多
猜你喜欢
Funpack第六期-MAX32660-EVSYS-计步器采用MAX32660-EVSYS做一个手表的应用,这边实现计步和显示功能
飞跃1989
1030
Funpack第六期-基于MAX32660-EVSYS的OLED手表利用MAX32660,配合1.54寸OLED彩色显示屏,Si7021温湿度传感器,DS3231高精度实时时钟,实现基础OLED手表功能
不是茄子
1024
FastBond智能可穿戴之智能手表原型MAX32660主控芯片,ADXL345测量倾角,SHT40测量温湿度,配有SS1306 12864OLED屏,通过RTC计算、显示万年历、倾角、温湿度信息,时间每秒刷新一次,倾角、温湿度每一分钟刷新一次,按键可即刻更新倾角、温湿度信息。
葉SiR
1722