有趣的灵魂KAKA 2021-10-13 13:11 采纳率: 50%
浏览 20

ds3231芯片收不到应答信号

用dsp28335采用软件模拟iic协议与ds3231进行通信但死活收不到应答信号,中间调试过延迟,代码也是根据网上单片机的代码修改而来,也换过芯片但就是不行。有没有大神能指点一下会是哪里出了问题。现在卡了一个多月了一点头绪都没有了!!!!代码都调的面目全非了,恳请懂得大神给点意见。谢谢!!!

  • 写回答

1条回答 默认 最新

  • lne8734 2021-10-13 14:57
    关注
    
    #ifndef __GPIO_I2C_H
    #define __GPIO_I2C_H
    
    #include "stm32f1xx_hal_def.h"
    
    typedef  struct _PinCfg
    {
        GPIO_TypeDef *port;
        uint32_t pin;
    } PinCfg;
    
    typedef struct _GPIO_I2C_Handle
    {
        PinCfg SCL;
        PinCfg SDA;
        int HalfClockCycle;
    } GPIO_I2C_Handle;
    
    typedef enum
    {
      GPIO_I2C_NACK = 0,
      GPIO_I2C_ACK
    } GPIO_I2C_Response;
    
    void GPIO_I2C_Init(GPIO_I2C_Handle *hi2c);
    void GPIO_I2C_Start(GPIO_I2C_Handle *hi2c);
    void GPIO_I2C_Stop(GPIO_I2C_Handle *hi2c);
    void GPIO_I2C_SendByte(GPIO_I2C_Handle *hi2c, uint8_t dat);
    uint8_t GPIO_I2C_RecvByte(GPIO_I2C_Handle *hi2c);
    void GPIO_I2C_Ack(GPIO_I2C_Handle *hi2c);
    void GPIO_I2C_NoAck(GPIO_I2C_Handle *hi2c);
    GPIO_I2C_Response GPIO_I2C_CheckAck(GPIO_I2C_Handle *hi2c);
    int GPIO_I2C_Master_Transmit(GPIO_I2C_Handle *hi2c, uint8_t DevAddress, uint8_t *pData, uint32_t size);
    int GPIO_I2C_Master_Receive(GPIO_I2C_Handle *hi2c, uint8_t DevAddress, uint8_t *pData, uint32_t size);
    
    
    #endif
    
    
    
    
    
    #include "stm32f1xx_hal.h"
    #include "gpio_i2c.h"
    #include "my_timer.h"
    
    
    void GPIO_I2C_Init(GPIO_I2C_Handle *hi2c)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
    
        /*SCL*/
        GPIO_InitStructure.Pin = hi2c->SCL.pin;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(hi2c->SCL.port, &GPIO_InitStructure);
     
        /*SDA*/
        GPIO_InitStructure.Pin = hi2c->SDA.pin;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(hi2c->SDA.port, &GPIO_InitStructure);
    }
    
    // 启动I2C
    void GPIO_I2C_Start(GPIO_I2C_Handle *hi2c)
    {
        HAL_GPIO_WritePin(hi2c->SDA.port, hi2c->SDA.pin, GPIO_PIN_SET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_SET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SDA.port, hi2c->SDA.pin, GPIO_PIN_RESET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_RESET);
        DelayUs(hi2c->HalfClockCycle);
    }
    
    // 产生I2C停止信号
    void GPIO_I2C_Stop(GPIO_I2C_Handle *hi2c)
    {
        HAL_GPIO_WritePin(hi2c->SDA.port, hi2c->SDA.pin, GPIO_PIN_RESET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_SET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SDA.port, hi2c->SDA.pin, GPIO_PIN_SET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_RESET);
        DelayUs(hi2c->HalfClockCycle);
    }
    
    // i2c发送一个字节
    void GPIO_I2C_SendByte(GPIO_I2C_Handle *hi2c, uint8_t dat)
    {
        int i;
     
        for (i = 0; i < 8; i++)
        {
            HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_RESET);
            DelayUs(hi2c->HalfClockCycle);
     
            if((dat & 0x80) == 0x80)
            {
                HAL_GPIO_WritePin(hi2c->SDA.port, hi2c->SDA.pin, GPIO_PIN_SET);
            }
            else
            {
                HAL_GPIO_WritePin(hi2c->SDA.port, hi2c->SDA.pin, GPIO_PIN_RESET);
            }
            dat <<= 1;
    
            HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_SET);
            DelayUs(hi2c->HalfClockCycle);
        }
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_RESET);
        DelayUs(hi2c->HalfClockCycle);
    }
    
    //i2c接收一个字节
    uint8_t GPIO_I2C_RecvByte(GPIO_I2C_Handle *hi2c)
    {
        int i;
        uint8_t u8Temp = 0;
    
        HAL_GPIO_WritePin(hi2c->SDA.port, hi2c->SDA.pin, GPIO_PIN_SET);
    
        for(i = 0; i < 8; i++)
        {
            HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_RESET);
            DelayUs(hi2c->HalfClockCycle);
     
            HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_SET);
            DelayUs(hi2c->HalfClockCycle);
            u8Temp <<= 1; //数据从高位开始读取
     
            if(HAL_GPIO_ReadPin(hi2c->SDA.port, hi2c->SDA.pin) == GPIO_PIN_SET)
            {
                u8Temp++;
            }
        }
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_RESET);
        DelayUs(hi2c->HalfClockCycle);
     
        return u8Temp;
    }
    
    //I2C主机应答
    void GPIO_I2C_Ack(GPIO_I2C_Handle *hi2c)
    {
        HAL_GPIO_WritePin(hi2c->SDA.port, hi2c->SDA.pin, GPIO_PIN_RESET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_SET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_RESET);
        DelayUs(hi2c->HalfClockCycle);
    }
    
    //I2C主机无应答
    void GPIO_I2C_NoAck(GPIO_I2C_Handle *hi2c)
    {
        HAL_GPIO_WritePin(hi2c->SDA.port, hi2c->SDA.pin, GPIO_PIN_SET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_SET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_RESET);
        DelayUs(hi2c->HalfClockCycle);
    }
    
    //检测从机应答
    GPIO_I2C_Response GPIO_I2C_CheckAck(GPIO_I2C_Handle *hi2c)
    {
        GPIO_I2C_Response response;
     
        HAL_GPIO_WritePin(hi2c->SDA.port, hi2c->SDA.pin, GPIO_PIN_SET);
        DelayUs(hi2c->HalfClockCycle);
     
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_SET);
        DelayUs(hi2c->HalfClockCycle);
     
        if(HAL_GPIO_ReadPin(hi2c->SDA.port, hi2c->SDA.pin) == GPIO_PIN_RESET)
            response = GPIO_I2C_ACK;
        else
            response = GPIO_I2C_NACK;
    
        HAL_GPIO_WritePin(hi2c->SCL.port, hi2c->SCL.pin, GPIO_PIN_RESET);
        DelayUs(hi2c->HalfClockCycle);
    
        return response;
    }
    
    int GPIO_I2C_Master_Transmit(GPIO_I2C_Handle *hi2c, uint8_t DevAddress, uint8_t *pData, uint32_t size)
    {
        uint8_t sendData = DevAddress & 0xFE;
        GPIO_I2C_Start(hi2c);
        GPIO_I2C_SendByte(hi2c, sendData);
        if (GPIO_I2C_CheckAck(hi2c) == GPIO_I2C_NACK)
        {
            return -1;
        }
    
        for (int i = 0; i < size; i++)
        {
            GPIO_I2C_SendByte(hi2c, pData[i]);
            if (GPIO_I2C_CheckAck(hi2c) == GPIO_I2C_NACK)
            {
                return -1;
            }
        }
        GPIO_I2C_Stop(hi2c);
        return 0;
    }
    
    int GPIO_I2C_Master_Receive(GPIO_I2C_Handle *hi2c, uint8_t DevAddress, uint8_t *pData, uint32_t size)
    {
        uint8_t sendData = DevAddress | 1;
        GPIO_I2C_Start(hi2c);
        GPIO_I2C_SendByte(hi2c, sendData);
        if (GPIO_I2C_CheckAck(hi2c) == GPIO_I2C_NACK)
        {
            return -1;
        }
    
        for (int i = 0; i < size; i++)
        {
            pData[i] = GPIO_I2C_RecvByte(hi2c);
            if (i == size - 1)
            {
                GPIO_I2C_NoAck(hi2c);
            }
            else
            {
                GPIO_I2C_Ack(hi2c);
            }
        }
        GPIO_I2C_Stop(hi2c);
        return 0;
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 10月13日

悬赏问题

  • ¥15 Tradingview两个副图指标叠加后。在不同的时间框架,和不同的产品,数值参数差异。导致可视化效果
  • ¥15 用js遍历数据并对非空元素添加css样式
  • ¥15 使用autodl云训练,希望有直接运行的代码(关键词-数据集)
  • ¥50 python写segy数据出错
  • ¥20 关于线性结构的问题:希望能从头到尾完整地帮我改一下,困扰我很久了
  • ¥30 3D多模态医疗数据集-视觉问答
  • ¥20 设计一个二极管稳压值检测电路
  • ¥15 内网办公电脑进行向日葵
  • ¥15 如何输入双曲线的参数a然后画出双曲线?我输入处理函数加上后就没有用了,不知道怎么回事去掉后双曲线可以画出来
  • ¥50 WPF Lidgren.Network.Core2连接问题