打印
[技术问答]

华大HC32F003 IIC 问题

[复制链接]
9079|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Some_Boy 于 2020-6-15 18:33 编辑

原来使用stm32f103 用模拟IIC 读取BMP180 数据 正常  。现在转换到 HC32F003 上面数据 读不出来!
各位大神帮帮看看!
有问题的:

stm32 读取的  这是好的:


下面是代码:

void BMP_IIC_Init(void)
{
       
        M0P_CLOCK->PERI_CLKEN_f.GPIO = 1;
       
        M0P_GPIO->P25_SEL =0x000; //普通IO
        M0P_GPIO->P26_SEL =0x000;
       
        M0P_GPIO->P2DIR_f.P25 =0;
        M0P_GPIO->P2DIR_f.P26 =0;
       
        M0P_GPIO->P2PU_f.P25 =1;
        M0P_GPIO->P2PU_f.P26 =1;
       
        M0P_GPIO->P2OD_f.P25 =1;//P25 开漏输出
        M0P_GPIO->P2OD_f.P26 =1;//P26 开漏输出
       
        M0P_GPIO->P2DR  = 0x00; //驱动能力高
        M0P_GPIO->P2DR_f.P25 = 0;
        M0P_GPIO->P2DR_f.P26 = 0;
        Gpio_SetIO(2,5,1);
        Gpio_SetIO(2,6,1);
}


void IIC_Init(void)
{
    BMP180SCL_H;  //SCL = 1;
    delay_us(5);
    BMP180SDA_H;  //SDA = 1;
    delay_us(5);   
}

void IIC_Start(void)
{
    BMP180SDA_H;  //SDA = 1;
    BMP180SCL_H;  //SCL = 1;
    delay_us(5);
    BMP180SDA_L;  //SDA = 0;
    delay_us(5);   
    BMP180SCL_L;    //SCL = 0;
       
}

void IIC_Stop(void)
{
    BMP180SDA_L;   //SDA = 0;
    BMP180SCL_L;   //SCL = 0;
    delay_us(5);
    BMP180SCL_H;   //SDA = 1;
    BMP180SDA_H;   //SCL = 1;
    delay_us(5);
}

unsigned char IIC_ReceiveACK(void)
{
    unsigned char ACKErr=0;
       
    BMP180SDA_H;     //SDA=1;//要读低电平需先拉高再读,否则读到的是错误数据,很重要!
        delay_us(5);
    BMP180SCL_H;     //SCL=1;
        delay_us(5);
    while(BMP180SDA_read==1)  //SDA为高
    {
            ACKErr++;
            if(ACKErr>250)
            {
                IIC_Stop();
                return 1;            
            }
    }
     BMP180SCL_L;     //SCL=0;
    return 0;               
}

void IIC_SendACK(unsigned char ack)
{
    BMP180SCL_L;   //SCL = 0;
       
    if (ack == 1)      
          BMP180SDA_H;
    else if (ack == 0) //应答
          BMP180SDA_L;
    delay_us(5);
    BMP180SCL_H;   //SCL = 1;
    delay_us(5);
    BMP180SCL_L;   //SCL = 0;
}

unsigned char IIC_SendByte(unsigned char dat)
{
    unsigned char i;
    unsigned char bResult=1;

    BMP180SCL_L;     //SCL = 0;//拉低时钟线

    for( i=0;i<8;i++ ) //一个SCK,把dat一位一位的移送到SDA上
    {
        if( (dat<<i)&0x80 )BMP180SDA_H;   //SDA = 1;//先发高位
        else BMP180SDA_L;  //SDA = 0;
        delay_us(5);

        BMP180SCL_H;  //SCL = 1;
        delay_us(5);
        BMP180SCL_L;  //SCL = 0;
        delay_us(5);

    }
    bResult=IIC_ReceiveACK(); //发送完一个字节的数据,等待接受应答信号
    return bResult;  //返回应答信号

}

unsigned char IIC_ReadByte(void)
{
    unsigned char dat;
    unsigned char i;

    for( i=0;i<8;i++ )
    {
        BMP180SCL_L;   //SCL = 0;
        delay_us(5);   
        BMP180SCL_H;   //SCL = 1;
            
        dat <<= 1;
        if(BMP180SDA_read)
                  dat++;
        delay_us(5);   
    }

    return dat;
}

/*从BMP180中读1个字节的数据*/

uint8_t BMP180_ReadOneByte(uint8_t ReadAddr)
{
    uint8_t temp = 0;
    uint8_t IIC_ComFlag = 1;   //IIC通信标志,为0标志正常,1表示通信错误

    IIC_Start();     //IIC start
    IIC_ComFlag = IIC_SendByte(BMP180_WR_ADDR);   //slave address+W:0
    printf("IIC_ComFlag=%u \r\n",IIC_ComFlag);

    if (IIC_ComFlag == 0)                           //返回值为0表示通信正常,可以继续通信。否则不通信了
    {
        IIC_SendByte(ReadAddr);                      //发送命令代码
        IIC_Start();
        IIC_SendByte(BMP180_WR_ADDR|0x01);         //slave address+R:1
        temp = IIC_ReadByte();                       //读数据
        IIC_SendACK(1);               
        IIC_Stop();

    }
    return (temp);     
}





使用特权

评论回复
沙发
smartpower| | 2020-6-15 22:46 | 只看该作者
本帖最后由 smartpower 于 2020-6-15 22:58 编辑

标题太吓人。根本就是不003的IIC有问题,是你的软件算法在003芯片上不工作。
理论上讲,这样的算法在任何一个IO型MCU都应该可以正常工作。

使用特权

评论回复
板凳
smartpower| | 2020-6-15 22:47 | 只看该作者
本帖最后由 smartpower 于 2020-6-15 22:57 编辑

软件模拟I2C,出了问题就查时序。
1. START - SLA+W +  SendBytes - STOP,展开示波器看时序,看ACK.
2. START - SLA+R +  RecvBytes - STOP,展开示波器看时序,看ACK,看Byte

使用特权

评论回复
地板
smartpower| | 2020-6-15 22:49 | 只看该作者
本帖最后由 smartpower 于 2020-6-15 22:59 编辑

使用特权

评论回复
5
Some_Boy|  楼主 | 2020-6-21 22:11 | 只看该作者

解决了  是 芯片的 问题   芯片在 开漏状态下 读取引脚的输入 数据  不是真实的电平数据。处于高阻态状态 。St32 芯片 引脚在开漏状态下 是可以读取 真实的数据。 时序没问题。

使用特权

评论回复
6
琢华| | 2021-9-15 17:09 | 只看该作者
Some_Boy 发表于 2020-6-21 22:11
解决了  是 芯片的 问题   芯片在 开漏状态下 读取引脚的输入 数据  不是真实的电平数据。处于高阻态状态 ...

改成无应答模式就可以了吗

使用特权

评论回复
7
binoo7| | 2021-9-16 13:34 | 只看该作者
官方例程读取的话,只配置引脚为输入,不配置开漏或其他模式,这样就行了

使用特权

评论回复
8
琢华| | 2021-9-16 13:56 | 只看该作者
binoo7 发表于 2021-9-16 13:34
官方例程读取的话,只配置引脚为输入,不配置开漏或其他模式,这样就行了 ...

官方例程是硬件IIC,有IO口模拟IIC吗

使用特权

评论回复
9
binoo7| | 2021-9-16 14:23 | 只看该作者
官方没有模拟IIC,你可以参考野火或者正点原子的例程,但是在引脚配置的时候需要注意,到底是配置成发送还是接收,引脚发送接收配置参考官方例程

使用特权

评论回复
10
长江一道浪| | 2022-8-17 09:36 | 只看该作者
楼主 你用过HC32F460写过这个程序没,我软件I2C一直没通,硬件也是,求指点一下。

使用特权

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

本版积分规则

6

主题

44

帖子

0

粉丝