求助啊!I2C和MPU6050一直出不来结果

2019-07-21 18:49发布

这下面是我的程序    求帮我看看啊



void i2cinit()
{
        SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
  GPIOPinConfigure(GPIO_PB2_I2C0SCL);
  GPIOPinConfigure(GPIO_PB3_I2C0SDA);
        GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);
  GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);
        GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPU);
  GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_3,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_OD);
        I2CMasterInitExpClk(I2C0_BASE, SysCtlClockGet(), false);
        I2CMasterEnable(I2C0_BASE);
}
void write(uint8_t DevAddr,uint8_t RegAddr,uint8_t writedata)
{
        I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, false);
        I2CMasterDataPut(I2C0_BASE,RegAddr);
        while(I2CMasterBusy(I2C0_BASE)){}
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
        while(I2CMasterBusy(I2C0_BASE)){}
  I2CMasterDataPut(I2C0_BASE, writedata);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
  while(I2CMasterBusy(I2C0_BASE)){}
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
        i2cinit();
}
uint8_t read(uint8_t DevAddr,uint8_t RegAddr)
{
int data;
        I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, false);
        I2CMasterDataPut(I2C0_BASE,RegAddr);
        while(I2CMasterBusy(I2C0_BASE)){}
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
        while(I2CMasterBusy(I2C0_BASE)){}
        I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, true);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
  while(I2CMasterBusy(I2C0_BASE)){}
        data= I2CMasterDataGet(I2C0_BASE);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
        i2cinit();
        return data;
}
void mpuinit()
{
        SysCtlDelay(100* (SysCtlClockGet() / 3000));
        write(0x50,PWR_MGMT_1, 0x80);
        SysCtlDelay(100* (SysCtlClockGet() / 3000));
        write(0x50,PWR_MGMT_1, 0x01);
        write(0x50,SMPLRT_DIV, 0x07);
        write(0x50,CONFIG, 0x06);
        write(0x50,GYRO_CONFIG, 0x18);
        write(0x50,ACCEL_CONFIG, 0x00);
}
int
main(void)
{
        init();
        i2cinit();
        InitConsole();
        mpuinit();
        while(1){
        UARTprintf("%o ",read(0x50,0x68));
  delay(500);}}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
1223657347
2019-07-23 02:49
  1. /**
  2.   ******************************************************************************
  3.   * [url=home.php?mod=space&uid=288409]@file[/url]    MyI2C.c
  4.   * [url=home.php?mod=space&uid=187600]@author[/url]  KEN
  5.   * [url=home.php?mod=space&uid=895143]@version[/url] V1.0
  6.   * [url=home.php?mod=space&uid=212281]@date[/url]    2015年6月21日
  7.   * @brief         My Inter-Integrated Circuit, IIC相关函数的实现
  8.   ******************************************************************************
  9.   * @attention
  10.   *
  11.   * 本固件仅供参考,为客户提供产品的编码信息,以便节省客户时间。由该固件的使用而
  12.   * 造成产品上的损失的,Ks'P概不承担直接或间接的责任。
  13.   *
  14.   * <h2><center>&copy; COPYRIGHT 2015 Ks'P</center></h2>
  15.   ******************************************************************************
  16.   */
  17. #include "stdint.h"
  18. #include "stdbool.h"
  19. #include "stdio.h"

  20. #include "MyI2C.h"

  21. #include "sysctl.h"
  22. #include "gpio.h"
  23. #include "i2c.h"
  24. #include "pin_map.h"
  25. #include "bit_band.h"

  26. /**
  27.   * [url=home.php?mod=space&uid=247401]@brief[/url]  等待目标从机准备完毕(wait target device stand by until ACK)
  28.   * @param  DeviceAddr:从机地址
  29.   * @retval 无
  30.   */
  31. void MyI2C_WaitDeviceForStandBy(uint8_t DeviceAddr)
  32. {
  33.         I2CMasterSlaveAddrSet(I2C1_BASE, DeviceAddr >> 1, false);
  34.        
  35.         do
  36.         {
  37.                 I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START | (~BIT0)); //no data
  38.                
  39.                 while(I2CMasterBusy(I2C1_BASE))
  40.                         ;
  41.         }
  42.         while(I2CMasterErr(I2C1_BASE) & BIT2);
  43. }

  44. /**
  45.   * @brief  向目标从机内部寄存器写入数据
  46.   * @param  DeviceAddr:从机地址
  47.                         RegAddr:寄存器地址
  48.                         wbuff:要写入的数据
  49.                         LenOfReg:寄存器大小(按字节)(count by Byte)(必须小于等于4)
  50.                         LenOfBuff:写入数据的长度(按字节)(count by Byte)
  51.   * @retval 无
  52.   */
  53. void MyI2C_WriteReg(uint8_t DeviceAddr, uint32_t RegAddr, uint8_t *wbuff, uint32_t LenOfReg, uint32_t LenOfBuff)
  54. {
  55.         uint32_t i = 0;
  56.        
  57.         I2CMasterSlaveAddrSet(I2C1_BASE, DeviceAddr >> 1, false);
  58.        
  59.         while(LenOfReg--)
  60.         {
  61.                 I2CMasterDataPut(I2C1_BASE, *((uint8_t *)(&RegAddr) + LenOfReg));
  62.                
  63.                 if(i ==0 )
  64.                 {
  65.                         I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
  66.                 }
  67.                 else
  68.                 {
  69.                         I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
  70.                 }
  71.                
  72.                 while(I2CMasterBusy(I2C1_BASE))
  73.                         ;
  74.                
  75.                 i++;
  76.         }
  77.        
  78.         i = 0;
  79.        
  80.         while(LenOfBuff--)
  81.         {
  82.                 I2CMasterDataPut(I2C1_BASE, *(wbuff + i));
  83.                
  84.                 if(LenOfBuff != 0)
  85.                 {
  86.                         I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
  87.                 }
  88.                 else
  89.                 {
  90.                         I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
  91.                 }
  92.                
  93.                 while(I2CMasterBusy(I2C1_BASE))
  94.                         ;
  95.                
  96.                 i++;
  97.         }
  98. }

  99. /**
  100.   * @brief  从目标从机内部寄存器读出数据
  101.   * @param  DeviceAddr:从机地址
  102.                         RegAddr:寄存器地址
  103.                         wbuff:要读出的数据缓冲区
  104.                         LenOfReg:寄存器大小(按字节)(count by Byte)(必须小于等于4)
  105.                         LenOfBuff:读出数据的缓冲区长度(按字节)(count by Byte)
  106.   * @retval 无
  107.   */
  108. void MyI2C_ReadReg(uint8_t DeviceAddr, uint32_t RegAddr, uint8_t *rbuff, uint32_t LenOfReg, uint32_t LenOfBuff)
  109. {
  110.         uint32_t i = 0;
  111.        
  112.         I2CMasterSlaveAddrSet(I2C1_BASE, DeviceAddr >> 1, false);
  113.        
  114.         while(LenOfReg--)
  115.         {
  116.                 I2CMasterDataPut(I2C1_BASE, *((uint8_t *)(&RegAddr) + LenOfReg));
  117.                
  118.                 if(i == 0)
  119.                 {
  120.                         I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
  121.                 }
  122.                 else
  123.                 {
  124.                         I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
  125.                 }
  126.                
  127.                 while(I2CMasterBusy(I2C1_BASE))
  128.                         ;

  129.                 i++;
  130.         }
  131.        
  132.         I2CMasterSlaveAddrSet(I2C1_BASE, DeviceAddr >> 1, true);
  133.        
  134.         i = 0;
  135.        
  136.         while(LenOfBuff--)
  137.         {       
  138.                 if((LenOfBuff == 0)&&(i==0))
  139.                 {
  140.                         I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE); //NACK               
  141.                 }
  142.                 else
  143.                 {
  144.                         if(i == 0)
  145.                         {
  146.                                 I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START); //ACK               
  147.                         }
  148.                         else
  149.                         {
  150.                                 if(LenOfBuff != 0)
  151.                                 {
  152.                                         I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT); //ACK               
  153.                                 }
  154.                                 else
  155.                                 {
  156.                                         I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH); //NACK
  157.                                 }
  158.                         }
  159.                 }
  160.                
  161.                 while(I2CMasterBusy(I2C1_BASE))
  162.                         ;

  163.                 *(rbuff + i) = (uint8_t)I2CMasterDataGet(I2C1_BASE);
  164.                
  165.                 i++;
  166.         }
  167. }
复制代码
楼主可以参考我调通过的I2C的代码(TM4C123GH6PM)

一周热门 更多>