网上down一个IIC模拟程序分析一下就是了,时序要求没那么精确的,大于多少ns就行了。稍作延时。上拉电阻一般就弄个10K。无论是对于哪种芯片IIC的时序是没多大差别的,弄个大概出来,在用示波器看,再比较手册,看哪不对再改。这样是调IIC最好方法。
还有,我不是记得STM32有硬IIC核吗,为何还需要用模拟IIC时序的方式去实现
有时候I2C被其他器件占用了的话还是有必要用GPIO模拟的。可以在板子初始化的时候或者加载设备驱动的时候设置GPIO的IO,是用来做INPUT还是OUTPUT,对于MCU来说,用来模拟CLK的肯定是OUTPUT了,然后DATA线是双向的。
在工作的时候所有的读写时序都需要自己写程序程序来控制。
设定一个线为时钟,把你的数据转换为十六进制然后在时钟低进行反转。
读取时别忘了地址加一,另外程序要使用串行结构这样才能同步。
并口焊接一个330OHM电阻限流。
暂时就想到这么多
对于疑问1:for循环已经把数据从主器件发送到从器件,没错,后面加那几句是为了释放数据总线,这是芯片协议已经规定了的,为什么是scl=0;而sda=1呢,应该总线SCL与SDA都是线与关系,任意一个器件输出低电平,都使该总线的信号变低,你可能会这么想:为什么不是scl=1;delay();sda=1;delay();呢?那是因为当scl=1;sda=1;这是终止信号。对吧,这样写的话IIC将会停止工作。
对于疑问2:加这几句也一样,是芯片现已规定:无论是写数据还是读数据,写完读完之后需释放总线,for循环语句的意思是:
for(i=0;i<8;i++)
{
scl=1; //拉高时钟总线,开始读数据
delay();
k=(k<<1)|sda; // 将读取到的sda数据存放到k中,这里你可能有点无法理解,我举个例子:刚开始k=0x00(系统默认),当读取到的sda数据为1时,k=0x01;对吧,反之当读取到的sda数据为0时,k=0x00;
scl=0;// 读取完一个数据,拉低时钟总线
delay();
}
就这样循环8次,这样一个字节的数据就从主器件读到了从器件了。对吧。
如果那个释放总线你理解不了,你就记住,这是芯片协议规定,读完或写完都必须释放总线。iic协议都是如此。
希望能帮助到你。
只有STM32F103 C8051F 等档次较高的单片机才有IIC总线接口.
大多数单片机都没有IIC总线接口,用普通IO口模拟程序也不复杂,传输速度也不低,所以一般都用模拟IIC时序
ReadAddr是个16bit的数据,可分为高8bit和低8bit
两个可能:
1高8位为寄存器地址的高8位,低8位为寄存器地址的低8位。就像if里面走的
2高8位为从机地址(slave地址)的一部分,也是7位的slave地址(所以要左移一位(ReadAddr/256)<<1),而且是以0xA0为基址的从机地址,所以从机地址应该是:(0XA0+((ReadAddr/256)<<1)),低8位为寄存器地址的低8位。就像else里面的走的
以上 是我的理解 可能有所偏差
以上就是关于stm32引脚模拟IIC读写atmel 24C128,我是初级菜鸟,哪位大神可以赐教全部的内容,包括:stm32引脚模拟IIC读写atmel 24C128,我是初级菜鸟,哪位大神可以赐教、用ARM的GPIO来模拟IIC可以吗要怎么做、如何用Labview编程实现并口模拟IIC总线等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)