打印
[STM32F4]

有偿找人帮调试一个i2c程序

[复制链接]
4653|42
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qq8605578|  楼主 | 2016-2-18 13:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序我这边发过去,只调试i2c部分,模拟也可以,硬件也可以,IAR的工程。调的快崩溃了,在f1上能正常跑的i2c,拿到f4上面咋调都不行。有兴趣联系qq:345344300
沙发
crystal1987| | 2016-2-18 14:10 | 只看该作者
你把代码发出来,大家帮忙看看,很多人不一定有F4的板子。

使用特权

评论回复
板凳
qq8605578|  楼主 | 2016-2-18 14:18 | 只看该作者
crystal1987 发表于 2016-2-18 14:10
你把代码发出来,大家帮忙看看,很多人不一定有F4的板子。

#include "main.h"



/*******************************************************************************
* Function Name  : I2C_Configuration
* Description    : EEPROM管脚配置
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void I2C_Configuration(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    /* Configure I2C2 pins: PB6->SCL and PB7->SDA */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;     
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}


/*******************************************************************************
* Function Name  : I2C_delay
* Description    : 延迟时间
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
static void I2C_delay(void)
{       
   uint8_t i=20; /* 这里可以优化速度,经测试最低到5还能写入 */
   while(i)
   {
     i--;
   }
}

/*******************************************************************************
* Function Name  : I2C_Start
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
u8 I2C_Start(void)
{
        SDA_OUT();
        SDA_H;
        SCL_H;
        I2C_delay();
        SDA_IN();
        if(!SDA_read)return DISABLE;
        SDA_OUT();
        SDA_L;
        I2C_delay();
        SDA_IN();
        if(!SDA_read)return DISABLE;
        SDA_OUT();
        SDA_L;
        I2C_delay();
        return TRUE;
       
}

/*******************************************************************************
* Function Name  : I2C_Stop
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void I2C_Stop(void)
{
        SDA_OUT();
        SCL_L;
        I2C_delay();
        SDA_L;
        I2C_delay();
        SCL_H;
        I2C_delay();
        SDA_H;
        I2C_delay();
}

/*******************************************************************************
* Function Name  : I2C_Ack
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
static void I2C_Ack(void)
{       
        SDA_OUT();
        SCL_L;
        I2C_delay();
        SDA_L;
        I2C_delay();
        SCL_H;
        I2C_delay();
        SCL_L;
        I2C_delay();
}

/*******************************************************************************
* Function Name  : I2C_NoAck
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void I2C_NoAck(void)
{       
        SDA_OUT();
        SCL_L;
        I2C_delay();
        SDA_H;
        I2C_delay();
        SCL_H;
        I2C_delay();
        SCL_L;
        I2C_delay();
}

/*******************************************************************************
* Function Name  : I2C_WaitAck
* Description    : None
* Input          : None
* Output         : None
* Return         : 返回为:=1有ACK,=0无ACK
* Attention                 : None
*******************************************************************************/
u8 I2C_WaitAck(void)        
{
        SDA_OUT();
        SCL_L;
        I2C_delay();
        SDA_H;                       
        I2C_delay();
        SCL_H;
        SDA_IN();
        I2C_delay();
        if(SDA_read)
        {
          SCL_L;
          return DISABLE;
        }
        SCL_L;
        return ENABLE;
}

/*******************************************************************************
* Function Name  : I2C_SendByte
* Description    : 数据从高位到低位
* Input          : - SendByte: 发送的数据
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void I2C_SendByte(uint8_t SendByte)
{
    SDA_OUT();
    uint8_t i=8;
    while(i--)
    {
        SCL_L;
        I2C_delay();
      if(SendByte&0x80)
        SDA_H;  
      else
        SDA_L;   
        SendByte<<=1;
        I2C_delay();
        SCL_H;
        I2C_delay();
    }
    SCL_L;
}


/*******************************************************************************
* Function Name  : I2C_ReceiveByte
* Description    : 数据从高位到低位
* Input          : None
* Output         : None
* Return         : I2C总线返回的数据
* Attention                 : None
*******************************************************************************/
static uint8_t I2C_ReceiveByte(void)  
{
    SDA_OUT();
    uint8_t i=8;
    uint8_t ReceiveByte=0;

    SDA_H;                               
    while(i--)
    {
      ReceiveByte<<=1;      
      SCL_L;
      I2C_delay();
      SCL_H;
      SDA_IN();
      I2C_delay();       
      if(SDA_read)
      {
        ReceiveByte|=0x01;
      }
    }
    SCL_L;
    return ReceiveByte;
}

/*******************************************************************************
* Function Name  : I2C_WriteByte
* Description    : 写一字节数据
* Input          : - SendByte: 待写入数据
*                      - WriteAddress: 待写入地址
*                  - DeviceAddress: 器件类型(24c16或SD2403)
* Output         : None
* Return         : 返回为:=1成功写入,=0失败
* Attention                 : None
*******************************************************************************/           
FunctionalState I2C_WriteByte(uint8_t SendByte, uint16_t WriteAddress, uint8_t DeviceAddress)
{               
    if(!I2C_Start())return DISABLE;
    I2C_SendByte(((WriteAddress & 0x0700) >>7) | DeviceAddress & 0xFFFE); /*设置高起始地址+器件地址 */
    if(!I2C_WaitAck()){I2C_Stop(); return DISABLE;}
    I2C_SendByte((uint8_t)(WriteAddress & 0x00FF));   /* 设置低起始地址 */      
    I2C_WaitAck();       
    I2C_SendByte(SendByte);
    I2C_WaitAck();   
    I2C_Stop();
        /* 注意:因为这里要等待EEPROM写完,可以采用查询或延时方式(10ms)        */
    /* Systick_Delay_1ms(10); */
    return ENABLE;
}                                                                         

/*******************************************************************************
* Function Name  : I2C_ReadByte
* Description    : 读取一串数据
* Input          : - pBuffer: 存放读出数据
*                      - length: 待读出长度
*                  - ReadAddress: 待读出地址
*                  - DeviceAddress: 器件类型(24c16或SD2403)
* Output         : None
* Return         : 返回为:=1成功读入,=0失败
* Attention                 : None
*******************************************************************************/         
FunctionalState I2C_ReadByte(uint8_t* pBuffer,   uint16_t length,   uint16_t ReadAddress,  uint8_t DeviceAddress)
{               
    if(!I2C_Start())return DISABLE;
    I2C_SendByte(((ReadAddress & 0x0700) >>7) | DeviceAddress & 0xFFFE); /* 设置高起始地址+器件地址 */
    if(!I2C_WaitAck()){I2C_Stop(); return DISABLE;}
    I2C_SendByte((uint8_t)(ReadAddress & 0x00FF));   /* 设置低起始地址 */      
    I2C_WaitAck();
    I2C_Start();
    I2C_SendByte(((ReadAddress & 0x0700) >>7) | DeviceAddress | 0x0001);
    I2C_WaitAck();
    while(length)
    {
      *pBuffer = I2C_ReceiveByte();
      if(length == 1)I2C_NoAck();
      else I2C_Ack();
      pBuffer++;
      length--;
    }
    I2C_Stop();
    return ENABLE;
}



unsigned char I2C_RadeByte(void)  
{
    SDA_OUT();
    u8 i=8;
    u8 ReceiveByte=0;

    SDA_H;                               
    while(i--)
    {
      ReceiveByte<<=1;      
      SCL_L;
      I2C_delay();
      SCL_H;
      SDA_IN();
      I2C_delay();       
      if(SDA_read)
      {
        ReceiveByte|=0x01;
      }
    }
    SCL_L;
    return ReceiveByte;
}
u8 Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)                     //void
{
    if(!I2C_Start())return FALSE;
    I2C_SendByte(SlaveAddress);   
    if(!I2C_WaitAck())
    {
        I2C_Stop();
        return FALSE;
    }
    I2C_SendByte(REG_Address );     
    I2C_WaitAck();       
    I2C_SendByte(REG_data);
    I2C_WaitAck();   
    I2C_Stop();
    delay5ms();
    return TRUE;
}

//μ¥×??ú?áè?*****************************************
unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
{   

    unsigned char REG_data;            
    if(!I2C_Start())return FALSE;
    I2C_SendByte(SlaveAddress); //
    if(!I2C_WaitAck())
    {
        I2C_Stop();
        return FALSE;
    }
    I2C_SendByte((u8) REG_Address);   //设置低起始地址   
    I2C_WaitAck();
    I2C_Start();
    I2C_SendByte(SlaveAddress+1);
    I2C_WaitAck();
    REG_data= I2C_RadeByte();
    I2C_NoAck();
    I2C_Stop();

    return REG_data;
}
void delay5ms(void)
{
               
   int x,y;
   for(x=110;x>0;x--)
       for(y=5000;y>0;y--);

}

使用特权

评论回复
地板
qq8605578|  楼主 | 2016-2-18 14:19 | 只看该作者
#define SCL_H         GPIOC->BSRRH = GPIO_Pin_6         /* GPIO_SetBits(GPIOB , GPIO_Pin_6)   */
#define SCL_L         GPIOC->BSRRL = GPIO_Pin_6   /* GPIO_ResetBits(GPIOB , GPIO_Pin_6) */

#define SDA_H         GPIOC->BSRRH = GPIO_Pin_7         /* GPIO_SetBits(GPIOB , GPIO_Pin_7)   */
#define SDA_L         GPIOC->BSRRL = GPIO_Pin_7         /* GPIO_ResetBits(GPIOB , GPIO_Pin_7) */

#define SCL_read      GPIO_ReadInputDataBit(GPIOC , GPIO_Pin_6) */
#define SDA_read      GPIO_ReadInputDataBit(GPIOC , GPIO_Pin_7)
#define SDA_IN()  {GPIOC->MODER&=~(3<<(7*2));GPIOC->MODER|=0<<7*2;}       
#define SDA_OUT() {GPIOC->MODER&=~(3<<(7*2));GPIOC->MODER|=1<<7*2;}

使用特权

评论回复
5
qq8605578|  楼主 | 2016-2-18 14:19 | 只看该作者
void Init_MPU9250(void)
{
/*  
   Single_Write(GYRO_ADDRESS,PWR_M, 0x80);   //
   Single_Write(GYRO_ADDRESS,SMPL, 0x07);    //
   Single_Write(GYRO_ADDRESS,DLPF, 0x1E);    //根据手册,按需修改
   Single_Write(GYRO_ADDRESS,INT_C, 0x00 );  //
   Single_Write(GYRO_ADDRESS,PWR_M, 0x00);   //
*/
    Single_Write(GYRO_ADDRESS,PWR_MGMT_1, 0x80);
    Delaym(5000);
    Single_Write(GYRO_ADDRESS,PWR_MGMT_1, 0x00);        //解除休眠
    Delaym(5000);
    Single_Write(GYRO_ADDRESS,SMPLRT_DIV, 0xC8);        //采样频率设置
    Single_Write(GYRO_ADDRESS,MPU_CONFIG, 0x01);        //低通滤波器设置
    Single_Write(GYRO_ADDRESS,GYRO_CONFIG, 0x18);       // 0001 1000     0x18 = 2000°/s   0x00 = 250  0x08 = 500    0x10 = 1000
    Single_Write(GYRO_ADDRESS,ACCEL_CONFIG, 0x01);      // 0001 1001     0x11 = 8g  0x01 = 2g  0x09 = 4g  0x19 = 16g
  //----------------
    Delaym(5000);
    Single_Write(GYRO_ADDRESS,RA_INT_ENABLE, 0x01);     //使能 data ready 中断
    Delaym(5000);
    Single_Write(GYRO_ADDRESS,RA_INT_ENABLE, 0x01);     //使能 data ready 中断
    Delaym(5000);
    Single_Write(MAG_ADDRESS,0x0A, 0x01);//16bit output
    Delaym(5000);
    Single_Write(MAG_ADDRESS,0x0A, 0x01);//16bit output
}

使用特权

评论回复
6
qq8605578|  楼主 | 2016-2-18 14:21 | 只看该作者
void MPU_getData(u8* buf)
{
    //ACC X Y X
    *(buf + 0)=Single_Read(ACCEL_ADDRESS,ACCEL_XOUT_H);
    *(buf + 1)=Single_Read(ACCEL_ADDRESS,ACCEL_XOUT_L);
    *(buf + 2)=Single_Read(ACCEL_ADDRESS,ACCEL_YOUT_H);
    *(buf + 3)=Single_Read(ACCEL_ADDRESS,ACCEL_YOUT_L);
    *(buf + 4)=Single_Read(ACCEL_ADDRESS,ACCEL_ZOUT_H);
    *(buf + 5)=Single_Read(ACCEL_ADDRESS,ACCEL_ZOUT_L);
    //GYRO X Y Z
    *(buf + 6)=Single_Read(GYRO_ADDRESS,GYRO_XOUT_H);
    *(buf + 7)=Single_Read(GYRO_ADDRESS,GYRO_XOUT_L);
    *(buf + 8)=Single_Read(GYRO_ADDRESS,GYRO_YOUT_H);
    *(buf + 9)=Single_Read(GYRO_ADDRESS,GYRO_YOUT_L);
    *(buf +10)=Single_Read(GYRO_ADDRESS,GYRO_ZOUT_H);
    *(buf +11)=Single_Read(GYRO_ADDRESS,GYRO_ZOUT_L);
   

    //turn on Bypass Mode
    Single_Write(GYRO_ADDRESS,0x37,0x02);
    ;
    ;
    //if((Single_Read(MAG_ADDRESS,0x02))==0x01)
    {
    //MAG X Y Z
    // if(count%20==0)//Single_Read(MAG_ADDRESS,0x02))
   
    *(buf +12)=Single_Read(MAG_ADDRESS,MAG_XOUT_H);
    *(buf +13)=Single_Read(MAG_ADDRESS,MAG_XOUT_L);
    *(buf +14)=Single_Read(MAG_ADDRESS,MAG_YOUT_H);
    *(buf +15)=Single_Read(MAG_ADDRESS,MAG_YOUT_L);
    *(buf +16)=Single_Read(MAG_ADDRESS,MAG_ZOUT_H);
    *(buf +17)=Single_Read(MAG_ADDRESS,MAG_ZOUT_L);  
   
    Single_Write(MAG_ADDRESS,0x0A, 0x11);
    ;;;
    }

}
I2C_Configuration();
    USART_485_Configuration();   
    RS485_DMA_Init();
    NVIC_Configuration();
    EXTIX_Init();
while(1)         //主循环
    {

        //u8 flag=0;
        //flag=Single_Read(GYRO_ADDRESS,INT_STATUS);
        //while(!(flag & 0x01))
        {
            //Delay(0x1FF);
            //flag=Single_Read(GYRO_ADDRESS,INT_STATUS);
        }
        MPU_getData(buffer+2);
        RS485_DMA_Send((unsigned char *)buffer,20);  //发送一帧数据
        GPIO_ToggleBits(GPIOC, GPIO_Pin_13);
        Delay(0x7FFFF);

   
    }
}

使用特权

评论回复
7
求学问路| | 2016-2-18 16:29 | 只看该作者
跑F1的频率是多少?跑F4的频率是多少?频率不一致 这个I2C_delay()是要调整的

使用特权

评论回复
8
小小小小白| | 2016-2-18 16:51 | 只看该作者
我有f407

使用特权

评论回复
9
仙女山| | 2016-2-18 16:52 | 只看该作者

你这是模拟的啊,管脚设置的问题比较大

使用特权

评论回复
10
仙女山| | 2016-2-18 16:53 | 只看该作者
还有,你的时钟在f0和f4上是不一样的,中间的延时需要调整一下

使用特权

评论回复
11
eastzsp| | 2016-2-18 17:10 | 只看该作者
要是别的板子好的,换个环境就不行,多半是延时和管脚设置原因。

使用特权

评论回复
12
天奕| | 2016-2-18 17:18 | 只看该作者
http://blog.csdn.net/chen244798611/article/details/50225709这里时候我写的F4的I2C,你可以参考 你的管脚初始化有问题

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
dong_abc + 6
13
qq8605578|  楼主 | 2016-2-18 17:19 | 只看该作者
求学问路 发表于 2016-2-18 16:29
跑F1的频率是多少?跑F4的频率是多少?频率不一致 这个I2C_delay()是要调整的

我把I2C_delay里面的参数从5-200试过不少了。但没有一个可以的

f1的主频是72M,f4是168M的

使用特权

评论回复
14
qq8605578|  楼主 | 2016-2-18 17:20 | 只看该作者

能方便给调试下不,

使用特权

评论回复
15
qq8605578|  楼主 | 2016-2-18 17:21 | 只看该作者
仙女山 发表于 2016-2-18 16:52
你这是模拟的啊,管脚设置的问题比较大

管脚设置我都按f4的方式改了,上面有我贴出来的配置,
I2C_delay里面的参数从5-200试过不少了。但没有一个可以的

使用特权

评论回复
16
molink| | 2016-2-18 17:51 | 只看该作者
PB6,7还是PC6,7啊?

使用特权

评论回复
17
molink| | 2016-2-18 17:52 | 只看该作者
注释的I2C脚和配置的不一样啊

使用特权

评论回复
18
jar1866| | 2016-2-18 18:26 | 只看该作者
如果引脚对了,代码问题不大,请再次确认SCL SDA操作起到了对应的作用,用万用表两下,比如拉高拉低是否对了

使用特权

评论回复
19
qq8605578|  楼主 | 2016-2-18 18:26 | 只看该作者
molink 发表于 2016-2-18 17:51
PB6,7还是PC6,7啊?

PB6.7是我板子上焊接的mpu9150.因为是手焊,无法保证有没有虚焊,就外界出来两根线,接的模块。模块接的正好是PC6.7

使用特权

评论回复
20
qq8605578|  楼主 | 2016-2-18 20:09 | 只看该作者
天奕 发表于 2016-2-18 17:18
http://blog.csdn.net/chen244798611/article/details/50225709这里时候我写的F4的I2C,你可以参考 你的管 ...

多谢,,我对着你的程序改下试试。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

74

帖子

0

粉丝