ds3231芯片收不到应答信号

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


#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;
}