野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12695|回复: 3

新入坑萌新求助 自己写了一个模拟I2C代码始终不好用 还请大神过来纠一下错

[复制链接]
发表于 2019-5-31 17:39:02 | 显示全部楼层 |阅读模式
目的是写一个I2C代码能在从设备的一个内存地址上读取16位或者是8位的数据  代码前八个函数是参考教程的 后俩函数是自己做过修改的 我曾经用这段代码尝试读取mpu6050的原始数据但是失败了失败 读数全是0 who I am 读出来也是0 有时候可能会读出其他乱七八糟的数 至于原因我一点头绪都没有 代码并没有卡死在哪里 但就是读出来一堆0 请哪位大佬好心帮我纠错 再确认一下 SDA引脚用的是PD13 SCL引脚用的是PD12(挑战者v1底板和stm32F767IGT6核心板)   
[mw_shl_code=c,true]
//延时函数 用systick中断延时 基本也参考了教程
__IO uint32_t TimingDelay = 0; //申明的是全局变量

void delay_us(__IO uint32_t nTime){
       
        TimingDelay = nTime;
}

void SysTick_Handler(void)
{
  Timing_Decrement();
}


void Timing_Decrement(void){
        if(TimingDelay!=0) TimingDelay--;
}



void I2C_Init(void){

    GPIO_InitTypeDef GPIO_InitStruct;
    __HAL_RCC_GPIOD_CLK_ENABLE();

    GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
    HAL_GPIO_Init(GPIOD,&GPIO_InitStruct);

    I2C_SDA(1);
    I2C_SCL(1);
}
void I2C_Start(void){
    SDA_OUT();
    I2C_SCL(0);
    I2C_SDA(0);
    delay_us(4);
    I2C_SCL(1);
    I2C_SDA(1);
    delay_us(4);
    I2C_SDA(0);
    delay_us(4);
    I2C_SCL(0);

}
void I2C_Stop(void){
    SDA_OUT();
    I2C_SCL(0);
    I2C_SDA(0);
    delay_us(4);
    I2C_SCL(1);
    delay_us(4);
    I2C_SDA(1);
    delay_us(4);
}
bool I2C_Wait_Ack(void){
    uint8_t ucErrTime = 0;
    SDA_IN();
    I2C_SDA(1); delay_us(1);
    I2C_SCL(1); delay_us(1);
    while(READ_SDA){
        ucErrTime++;
        if(ucErrTime > 250){
            I2C_Stop();
            return 1;
        }
    }
    I2C_SCL(0);
    return 0;
}
void I2C_Ack(void){
    I2C_SCL(0);
    SDA_OUT();
    I2C_SDA(0);
    delay_us(2);
    I2C_SCL(1);
    delay_us(2);
    I2C_SCL(0);
}

void I2C_NAck(void)
{
        I2C_SCL(0);
        SDA_OUT();
        I2C_SDA(1);
        delay_us(2);
        I2C_SCL(1);
        delay_us(2);
        I2C_SCL(0);
}

void I2C_Send_Byte(uint8_t txd){
    uint8_t t;
    SDA_OUT();
    I2C_SCL(0);
    for(t=0;t<8;t++){
       I2C_SDA((txd&0x80)>>7);
       txd<<=1;
       delay_us(2);
       I2C_SCL(1);
       delay_us(2);
       I2C_SCL(0);
       delay_us(2);
    }
}
uint8_t I2C_Read_Byte(unsigned char ack){
    unsigned char i,receive = 0;
    SDA_IN();
    for(i=0;i<8;i++){
        I2C_SCL(0);
        delay_us(2);
        I2C_SCL(1);
        receive<<=1;
        if(READ_SDA) receive++;
        delay_us(1);
    }
   if(!ack) I2C_NAck();
   else I2C_Ack();
               
   return receive;
}
void Read_Byte(uint16_t reg_add, uint8_t *temp,uint8_t tempsize){
    uint8_t i;
    I2C_Start();
    I2C_Send_Byte(Dev_addr+0x0);  
    while(I2C_Wait_Ack());
    I2C_Send_Byte(reg_add);
    while(I2C_Wait_Ack());
    I2C_Start();
    I2C_Send_Byte(Dev_addr|0x01);  // 发送读指令
                I2C_Wait_Ack();
    for (i=0;i<(tempsize-1);i++){  //此处用于读取8位或者16位数据 陀螺仪全是8位数据
        *temp = I2C_Read_Byte(1);
        temp++;
    }
    *temp = I2C_Read_Byte(0); //最后一位不应答
    I2C_Stop();
               
}
void Write_Byte(uint16_t reg_add, uint8_t *temp, uint8_t tempsize){
    uint8_t j;
    I2C_Start();
    I2C_Send_Byte(Dev_addr | 0); //发送写指令
    while(I2C_Wait_Ack());

    I2C_Send_Byte(reg_add);
    while(I2C_Wait_Ack());

    for(j=0;j<tempsize;j++){ //此处用于读取8或16位数据
        I2C_Send_Byte(*temp);
        temp++;
        while(I2C_Wait_Ack());
    }
    I2C_Stop();
}
[/mw_shl_code]

回复

使用道具 举报

发表于 2019-5-31 20:20:40 | 显示全部楼层
void Read_Byte(uint16_t reg_add, uint8_t *temp,uint8_t tempsize){
    uint8_t i;
    I2C_Start();
    I2C_Send_Byte(Dev_addr+0x0);  
    while(I2C_Wait_Ack());
    I2C_Send_Byte(reg_add);
    while(I2C_Wait_Ack());
    I2C_Start();
    I2C_Send_Byte(Dev_addr|0x01);  // 发送读指令
    I2C_Wait_Ack();
    for (i=0;i<(tempsize-1);i++){  //此处用于读取8位或者16位数据 陀螺仪全是8位数据
        *temp = I2C_Read_Byte(1);
        temp++;
    }
    *temp = I2C_Read_Byte(0); //最后一位不应答
    I2C_Stop();
     
}
为啥第二次发起时不一直等待ack了呢?
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-6-3 12:55:59 | 显示全部楼层
v1的底板是不是和F767的核心板是不是匹配上有些问题  是不是引脚的全是乱的
回复 支持 反对

使用道具 举报

发表于 2019-6-3 13:56:07 | 显示全部楼层
GGGGGundam 发表于 2019-6-3 12:55
v1的底板是不是和F767的核心板是不是匹配上有些问题  是不是引脚的全是乱的

不清楚,没用过f7系列的
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 09:14 , Processed in 0.027812 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表