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