记录一次从stm32F1向F4移植模拟iic的困惑

通讯的IC 是FDC2214 ,在F1运行时通讯正常,移植到F4时只需要修改下引脚IO的初始化,以及输入输出方向。

但是在测试时候发现了一个问题,在向FDC2214写入数据时,MSB的最高位始终无法写入 。

这里是对使用F103和f407对寄存器进行读写操作的测试结果。

读取寄存器数值

寄存器 F407 F103 写入初值
  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是使用STM32F103标准库进行软件模拟I2C读写一个字节的示例代码: ```c #include "stm32f10x.h" #define SDA_PIN GPIO_Pin_7 #define SCL_PIN GPIO_Pin_6 #define I2C_GPIO GPIOB void I2C_Delay(void) { volatile int i = 7; while(i--); } void I2C_Start(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = SCL_PIN; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); GPIO_SetBits(I2C_GPIO, SDA_PIN); GPIO_SetBits(I2C_GPIO, SCL_PIN); I2C_Delay(); GPIO_ResetBits(I2C_GPIO, SDA_PIN); I2C_Delay(); GPIO_ResetBits(I2C_GPIO, SCL_PIN); } void I2C_Stop(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = SCL_PIN; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); GPIO_ResetBits(I2C_GPIO, SDA_PIN); GPIO_SetBits(I2C_GPIO, SCL_PIN); I2C_Delay(); GPIO_SetBits(I2C_GPIO, SDA_PIN); I2C_Delay(); } void I2C_Ack(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = SCL_PIN; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); GPIO_ResetBits(I2C_GPIO, SDA_PIN); I2C_Delay(); GPIO_SetBits(I2C_GPIO, SCL_PIN); I2C_Delay(); GPIO_ResetBits(I2C_GPIO, SCL_PIN); } void I2C_Nack(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = SCL_PIN; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); GPIO_SetBits(I2C_GPIO, SDA_PIN); I2C_Delay(); GPIO_SetBits(I2C_GPIO, SCL_PIN); I2C_Delay(); GPIO_ResetBits(I2C_GPIO, SCL_PIN); } int I2C_WaitAck(void) { GPIO_InitTypeDef GPIO_InitStructure; uint8_t ack = 0; GPIO_InitStructure.GPIO_Pin = SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); GPIO_SetBits(I2C_GPIO, SDA_PIN); I2C_Delay(); GPIO_SetBits(I2C_GPIO, SCL_PIN); I2C_Delay(); if(GPIO_ReadInputDataBit(I2C_GPIO, SDA_PIN) == RESET) { ack = 1; } GPIO_ResetBits(I2C_GPIO, SCL_PIN); return ack; } void I2C_SendByte(uint8_t byte) { uint8_t i = 8; GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = SCL_PIN; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); while(i--) { if(byte & 0x80) { GPIO_SetBits(I2C_GPIO, SDA_PIN); } else { GPIO_ResetBits(I2C_GPIO, SDA_PIN); } I2C_Delay(); GPIO_SetBits(I2C_GPIO, SCL_PIN); I2C_Delay(); GPIO_ResetBits(I2C_GPIO, SCL_PIN); byte <<= 1; } } uint8_t I2C_ReadByte(void) { uint8_t i = 8; uint8_t byte = 0; GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_GPIO, &GPIO_InitStructure); while(i--) { byte <<= 1; GPIO_SetBits(I2C_GPIO, SCL_PIN); I2C_Delay(); if(GPIO_ReadInputDataBit(I2C_GPIO, SDA_PIN) == SET) { byte |= 0x01; } GPIO_ResetBits(I2C_GPIO, SCL_PIN); I2C_Delay(); } return byte; } void I2C_WriteByte(uint8_t device_addr, uint8_t reg_addr, uint8_t data) { I2C_Start(); I2C_SendByte(device_addr << 1); if(!I2C_WaitAck()) { I2C_Stop(); return; } I2C_SendByte(reg_addr); if(!I2C_WaitAck()) { I2C_Stop(); return; } I2C_SendByte(data); if(!I2C_WaitAck()) { I2C_Stop(); return; } I2C_Stop(); } uint8_t I2C_ReadByte(uint8_t device_addr, uint8_t reg_addr) { uint8_t data = 0; I2C_Start(); I2C_SendByte(device_addr << 1); if(!I2C_WaitAck()) { I2C_Stop(); return 0; } I2C_SendByte(reg_addr); if(!I2C_WaitAck()) { I2C_Stop(); return 0; } I2C_Start(); I2C_SendByte((device_addr << 1) | 0x01); if(!I2C_WaitAck()) { I2C_Stop(); return 0; } data = I2C_ReadByte(); I2C_Nack(); I2C_Stop(); return data; } ``` 这段代码将I2C总线的SDA和SCL引脚分别定义为GPIOB的第7和第6个引脚。I2C_Start()函数用于在总线上发送起始信号,I2C_Stop()函数用于发送停止信号。I2C_Ack()和I2C_Nack()函数分别用于发送应答或非应答信号。I2C_WaitAck()函数用于等待从设备发送的应答信号。I2C_SendByte()函数用于向从设备发送一个字节的数据,I2C_ReadByte()函数用于从从设备读取一个字节的数据。I2C_WriteByte()函数用于向从设备写入一个字节的数据,I2C_ReadByte()函数用于从从设备读取一个字节的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值