查看: 1296|回复: 0

[SAMG53] [体验篇七] ATSAMG53 Xplained Pro TWI之MPU6050移植

[复制链接]

80

主题

0

好友

4815

积分

状元

Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    前天 11:26
  • 签到天数: 514 天

    [LV.9]以坛为家II

    发表于 2014-6-13 10:13:44 |显示全部楼层
    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通信方式的,也就是AtmelTWI功能,移植时注意做两个读写功能的函数
    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

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /6 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-7 03:52 , Processed in 0.085133 second(s), 9 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部