SAMG53-XPRO 由于初接触学习,一步一步记录下自己的过程,以方便与大家一起分享,希望大家能多拍砖,共同进展。 [体验篇一]ATSAMG53 Xplained Pro 开箱验货 [体验篇二] ATSAMG53 Xplained Pro 获取资料 http://blog.sina.com.cn/s/blog_7e7fa4c80101k5v9.html [体验篇三] ATSAMG53 Xplained Pro LED控制 http://blog.sina.com.cn/s/blog_7e7fa4c80101k6kw.html [体验篇四] ATSAMG53 Xplained Pro 分析LED控制
http://blog.sina.com.cn/s/blog_7e7fa4c80101k9ef.html [体验篇五] ATSAMG53 Xplained Pro LED为我用 http://blog.sina.com.cn/s/blog_7e7fa4c80101kbu1.html [体验篇六] ATSAMG53 Xplained Pro UART串口功能 http://blog.sina.com.cn/s/blog_7e7fa4c80101kj6a.html SAMG53系列的单片机内部集成了TWI(Two-wire SerialInterface)总线。该总线具有I2C总线的特点,即接线简单,外部硬件只需两个上拉电阻,使用时钟线SCL和数据线SDA就可以将128个不同的设备互连到一起;而且支持主机和从机操作,器件可以工作于发送器模式或接收器模式,数据传输率高达400 kHz。正因为TWI总线具有这么多的优点,因此受到了使用者的青睐。 由于该总线与传统的I2C总线极其相似。因此不少人误以为TWI总线就是I2C总线,其实这只是一种简单化的理解。TWI总线是对I2C总线的继承和发展。它定义了自已的功能模块和寄存器,寄存器各位功能的定义与I2C总线并不相同;而且TWI总线引入了状态寄存器,使得TWI总线在操作和使用上比I2C总线更为灵活。在实际应用上,由于大部分单片机内部没有集成I2C总线,因此单片机的控制是通过模拟I2C总线的时序来完成其操作的。 (引用 AVR单片机的TWI总线的原理及应用.pdf) 一、硬件资源 SAMG53 具有两个TWI 以及一个高速TWI 二、软件移植 请复制以下文件 并添加头文件路径 引脚的初始化 在void board_init(void) #ifdef CONF_BOARD_TWI2 ioport_set_pin_peripheral_mode(TWI2_DATA_GPIO, TWI2_DATA_FLAGS); ioport_set_pin_peripheral_mode(TWI2_CLK_GPIO, TWI2_CLK_FLAGS); #endif |
TWI功能模块的初始化 pmc_enable_periph_clk(BOARD_ID_TWI_MPU6050); // ID_TWI2 opt.master_clk = sysclk_get_cpu_hz(); opt.speed = TWI_CLK; if (twi_master_init(BOARD_BASE_TWI_MPU6050, &opt) != TWI_SUCCESS) { puts("-E-\tTWI master initialization failed.\r"); LED_On(LED0); while (1) { } } |
我使用的时TWI2, 在查看引脚时一定要注意,这里建议查看以下文档 Atmel-42217-SAMG53-Xplained-Pro_User-Guide.pdf 这里有个小疑问: Atmel的官网的原理图 SAMG53_Xplained_Pro_design_documentation_release_rev1.pdf 不知道是用什么软件做的呢?与我们平常用画PCB软件有些出入 三、关于MPU6050的移植 MPU6050 是I2C通信方式的,也就是Atmel的TWI功能,移植时注意做两个读写功能的函数 static void MPU_Write_Byte(uint8_t tREG_Address, uint8_t tREG_Data) { twi_packet_t packet_tx; packet_tx.chip = MPU6050_ADDRESS; packet_tx.addr[0] = tREG_Address; //packet_tx.addr[1] = tREG_Address; packet_tx.addr_length = 1; packet_tx.buffer = (uint8_t *) &tREG_Data; packet_tx.length = 1; if (twi_master_write(BOARD_BASE_TWI_MPU6050, &packet_tx) != TWI_SUCCESS) { printf("-E-\tTWI master write packet failed.RegAddres: 0x%x 0x%x\r",tREG_Address,tREG_Data); LED_On(LED0); } else { printf("Write:\tOK!\n\r"); } } static void MPU6050_Read(uint8_t tREG_Address, uint8_t *tREG_Data, uint8_t tNum) { twi_packet_t packet_rx; packet_rx.chip = MPU6050_ADDRESS; packet_rx.addr[0] = tREG_Address;//高? tREG_Address>>8 //packet_rx.addr[1] = tREG_Address; packet_rx.addr_length = 1; packet_rx.buffer = tREG_Data; packet_rx.length = tNum; if (twi_master_read(BOARD_BASE_TWI_MPU6050, &packet_rx) != TWI_SUCCESS) { printf("-E-\tTWI master read packet failed.RegAddres: 0x%x \r",tREG_Address); LED_On(LED0); } else { puts("Read:\tOK!\r"); } } |
MPU6050 的初始化代码 static void MPU6050_Init(void) { MPU_Write_Byte(MPU6050_RA_PWR_MGMT_1,0x00);//电?源′管ü理え,?典?型í值μ:阰0x00(正y常£启?用?) internal 8MHz oscillator MPU_Write_Byte(MPU6050_RA_SMPLRT_DIV,0x01);//陀螺Y仪?采é样ù率ê,?典?型í值μ:阰0x07(125Hz) 输?出?频μ率ê1KHZ MPU_Write_Byte(MPU6050_RA_CONFIG, 0x06);//低台通滤?波¨频μ率ê,?典?型í值μ:阰0x06(5Hz) MPU_Write_Byte(MPU6050_RA_GYRO_CONFIG, 0x08);//陀螺Y仪?自?检ì及°测a量?范?围§,?典?型í值μ:阰0x18(不?自?检ì,?2000deg/s) MPU_Write_Byte(MPU6050_RA_ACCEL_CONFIG, 0x01);//加ó速ù计?自?检ì、¢测a量?范?围§及°高?通滤?波¨频μ率ê,?典?型í值μ:阰0x01(不?自?检ì,?2G,?5Hz) MPU_Write_Byte(MPU6050_RA_INT_PIN_CFG,0x80);//中D断?生Θ产ú 上?升沿?,?INT推?挽输?出?,?高?电?平?至á中D断?状痢态?被?读á取?0x80 MPU_Write_Byte(MPU6050_RA_INT_ENABLE,0x00);//使?能ü中D断?,?Data Ready interrupt 0x01 MPU_Write_Byte(MPU6050_RA_FF_THR, 0x00);//Freefall threshold of |0mg| MPU_Write_Byte(MPU6050_RA_FF_DUR, 0x00);//Freefall duration limit of 0 MPU_Write_Byte(MPU6050_RA_MOT_THR, 0x00);//Motion threshold of 0mg MPU_Write_Byte(MPU6050_RA_MOT_DUR, 0x00);//Motion duration of 0s MPU_Write_Byte(MPU6050_RA_ZRMOT_THR, 0x00);//Zero motion threshold MPU_Write_Byte(MPU6050_RA_ZRMOT_DUR, 0x00); //Zero motion duration threshold MPU_Write_Byte(MPU6050_RA_FIFO_EN, 0x00);//Disable sensor output to FIFO buffer } |
MPU6050 读取数据 while(1) { mdelay(100); MPU6050_Read(MPU6050_ACCE_XOUT,aucMpuData,14); ax = (int16_t)((aucMpuData[0]<<8)|(aucMpuData[1])); ay = (int16_t)((aucMpuData[2]<<8)|(aucMpuData[3])); az = (int16_t)((aucMpuData[4]<<8)|(aucMpuData[5])); gx = (int16_t)((aucMpuData[8]<<8)|(aucMpuData[9])); gy = (int16_t)((aucMpuData[10]<<8)|(aucMpuData[11])); gz = (int16_t)((aucMpuData[12]<<8)|(aucMpuData[13])); Ax = ax/MPU6050_ACCE_FS_SENSITIVITY; Ay = ay/MPU6050_ACCE_FS_SENSITIVITY; Az = az/MPU6050_ACCE_FS_SENSITIVITY; Gx = gx/MPU6050_GYRO_FS_SENSITIVITY; Gy = gy/MPU6050_GYRO_FS_SENSITIVITY; Gz = gz/MPU6050_GYRO_FS_SENSITIVITY; sprintf(aucDisplay,"%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\n",Ax,Ay,Az,Gx,Gy,Gz); //sprintf(aucDisplay,"%d,%d,%d,%d,%d,%d\n",ax,ay,az,gx,gy,gz); puts(aucDisplay); } |
通过串口工具查看结束 前三个为加速度数据,分别为X Y Z轴的加速度的数据, 当旋转MPU6050是,当那个轴指向正上向时,该数据就为1 而后面三个是陀螺仪的分别为X Y Z轴的旋转角速度的数据 数据的大小与旋转轴、旋转平面相关 ==============================================================================================
可能转载的原因,有些图片打不开,如果有需要请移步以下地址,不想重新上传图片,时间有限不便之处请原谅!同时请大家多拍砖,可以到我博客去观看!
http://blog.sina.com.cn/s/blog_7e7fa4c80101klgh.html
|