void I2C_Init(void) { I2C_close(); I2C_Ack(); I2C_FREQR=0x0f; //I2C外设时钟频率为8MHz I2C_CCRH=0x00; // I2C_CCRL=0x28; I2C_TRISER=0x11; I2C_open(); } void I2C_Write(unsigned char highbyte_add, unsigned char lowbyte_add, unsigned char data) { unsigned char temp; I2C_start(); while(!I2C_SBask); I2C_writebyte(Write_add); while(!I2C_addrask); temp=I2C_SR1; temp=I2C_SR3; I2C_writebyte(highbyte_add); while(!I2C_TxEask); I2C_writebyte(lowbyte_add); while(!I2C_TxEask); I2C_writebyte(data); while(!I2C_TxEask); I2C_stop(); } unsigned char I2C_Read(unsigned char highbyte_add,unsigned char lowbyte_add) { unsigned char temp; I2C_start(); while(!I2C_SBask); I2C_writebyte(Write_add); while(!I2C_addrask); 连续运行时总会卡在这一步,用示波器观察是没有收到应答信号。但是一步一步仿真测试的话是能接收 到应答信号的。在写数据到EEPROM的操作中不会出现这样的问题。 temp=I2C_SR3; I2C_writebyte(highbyte_add); while(!I2C_TxEask); temp=I2C_SR3; I2C_writebyte(lowbyte_add); while(!I2C_TxEask); I2C_start(); while(!I2C_SBask); I2C_writebyte(Read_add); while(!I2C_addrask); temp=I2C_SR3; while(!I2C_RxNeask); temp=I2C_DR; return temp; I2C_NAck(); I2C_stop(); } 哪位知道原因?我操作的是24C256。 |
从零开始操作STM8寄存器(风驰iCreate奉献)
【中文资料】初学STM8库函数的中文帮助软件
绝对经典的中文STM8学习手册,淘宝上学习板资料,友情大放送!
【原创教程】风驰iCreate独家开源STM8 27个例程和10多万字的pdf教程
STM8的LCD1602 4线驱动,为什么不工作
【精华资料】由零开始开发STM8
STM8S 的触摸库是如何在主程序中查询键的呢、
【精华资料】STM8的C语言编程1-14讲完整版
【精品教程】STM8系列单片机入门教程系列
STM8 第一次进中断不准【悬赏问答】
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
你的频率配置的多少?建议用100-400Khz的频率。
100KHz的
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
0x0f,这个应该是7Mhz的频率。8M是0x08
就是用示波器观察的,单步执行发送地址后能获取应答信号,连续运行就会出错,无应答。8MHz是0x0f,如果是8的话那是用10进制表示的时候。
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
还是频率的问题,我可能算错了。0f应该是15M的频率。8M是0x08。这个楼主可以再看看手册。
是我算错了,8MHz是0x08。晚上回家我再测试效果。
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
看现象应该是频率太高引起的不匹配。
刚看了一下,我系统时钟设置的就是8M,能提供给I2C接口的最高频率应该也只有8M吧?我刚看了之前测试拍的照片看时钟线频率确实是100KHz。我把照片也传一下。
这张是无应答的
这张是有应答的
最后这张是昨天晚上调试发现的问题,很奇怪。下面是读数据里接收数据的有端程序。
I2C_writebyte(Read_add);
while(!I2C_addrask);
temp=I2C_SR3; 在执行完这条后I2C_DR里确实正确的读取了24C256里面的内容
temp=I2C_DR; 但一执行读取I2C_DR里的数据这条后I2C_DR里的数据就全部制1,变成0xff,temp接收到的数据也就成0xff了。
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
示波器显示的频率是8Mhz,根据寄存器的值算,可能是超范围了。现在单步可以读取,程序是对的,如果用中断的方式是不是也会出这样的问题呢?
我用的查询法,还没有用中断试过。
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
我没用过STM8,其他的I2C都是类似的。但我不知道你读取SR3干什么用的,手册上写的是要清除ADDR时读取SR3。
搞定了,I2C写数据和读数据的操作之间没有延时,延时10ms以上就能读写了,20ms以上的话时序比较稳定。