【MCU】关于单片机抽风的问题排查

在将GD32F450的IIC代码移植到STM32F103上时遇到问题,表现为ack等待超时。通过逻辑分析仪检查发现数据发送异常,最高位被改为0。问题根源在于有符号和无符号整型数据类型的不匹配,导致在32位单片机中4字节存储时产生错误。解决方案包括确保数据类型一致或使用位操作清除高3字节。不同单片机和编译等级对代码处理方式不同,强调在单片机编程中应严格控制数据类型以避免类似问题。
摘要由CSDN通过智能技术生成

起因:之前有一份代码移植到STM32F103上面,调试IIC的接口时,遇到了玄学。

目录

背景介绍

问题原因

解决方法

扩展

总结


背景介绍

移植一份GD32F450操作IIC的代码到STM32F103上面,IIC是GPIO模拟的。代码在原有平台上可以正确操作IIC设备,但是在STM32单片机上面无法正常操作设备,会报ack等待超时的错误,经过排查,可以确定,代码移植是没有问题的,和GD32的代码完全一致。

问题原因

通过逻辑分析仪查看数据,一个个字节的和代码比对。最终发现IIC发送的数据和应该发送的数据不一样!

IIC发送的一个字节的最高位如果为1的话,会被强制改成0。现把接口部分的源代码放在下面,注意,代码是没有问题的。

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(u8 txd)
{
    u8 t;   
	u8 temp = 0;
	SDA_OUT(); 	    
    IIC_SCL0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
		if(((txd&0x80)>>7) == 1)
			IIC_SDA1;
		else
			IIC_SDA0;
		txd<<=1; 	  
		delay_us(IIC_TRANSFER_DELAY);   //对TEA5767这三个延时都是必须的
	
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值