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