完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
STM8S103的板子上,有一个默认自带的AT24C02芯片,I2C读写,程序可以正常工作。
但是当飞线接另一个芯片时,却不能正常通讯,总是死在等待slaveAddress的应答上,I2C通信失败。 请教一下,有人遇到类似问题,如何解决的?? 下面是代码: void Delayms(unsigned int ms) { unsigned int x , y; for(x = ms; x > 0; x--) /* ͨ¹ýÒ»¶¨ÖÜÆÚÑ»·½øÐÐÑÓʱ*/ for(y = 3000 ; y > 0 ; y--); } void IIC_Init() { PB_DDR_bit.DDR4 = 1; PB_DDR_bit.DDR5 = 1; PB_ODR_bit.ODR4 = 1; PB_ODR_bit.ODR5 = 1; PB_CR2_bit.C24 = 1; PB_CR2_bit.C25 = 1; I2C_CR2_bit.SWRST = 1; //I2C1->CR1 |= 1 << 15; asm("nop"); asm("nop"); asm("nop"); asm("nop"); I2C_CR2_bit.SWRST = 0; //I2C1->CR2 = ~I2C_CR2_FREQ; // I2C_FREQR_bit.FREQ = 16; //Freq = 36M I2C_CCRH_bit.F_S = 1; I2C_CCRH_bit.DUTY = 0; I2C_CCRL = 40; //200KHZ I2CFreq = PCLK1 / CCR / DUTY[λ] = 16MHZ / 40 / 2 = 200KHZ I2C_TRISER_bit.TRISE = 16 + 1; // I2C1->CR1 = ~I2C_CR1_SMBUS; I2C_CR1_bit.ENGC = 1; I2C_CR1_bit.PE = 1; } void IIC_Write(unsigned char subaddr , unsigned char Byte_addr , unsigned char *buffer , unsigned short num) { unsigned char i2csr1; //while(I2C1->SR2 I2C_SR2_BUSY); I2C_CR2_bit.START = 1; while(I2C_SR1_bit.SB == 0); i2csr1 = I2C_SR1; //SR1.AF I2C_DR = (subaddr); while(I2C_SR1_bit.ADDR == 0); i2csr1 = I2C_SR1; i2csr1 = I2C_SR3; I2C_DR = Byte_addr; while(I2C_SR1_bit.BTF == 0); i2csr1 = I2C_SR1; while(num > 0) { I2C_DR = *buffer; while(I2C_SR1_bit.BTF == 0); i2csr1 = I2C_SR1; buffer++; num--; } I2C_CR2_bit.STOP = 1; } void IIC_Read(unsigned char subaddr , unsigned char Byte_addr , unsigned char *buffer , unsigned short num) { unsigned char i2csr1; I2C_CR2_bit.ACK = 1; I2C_CR2_bit.START = 1; while(I2C_SR1_bit.SB == 0); i2csr1 = I2C_SR1; I2C_DR = subaddr; while(I2C_SR1_bit.ADDR == 0); i2csr1 = I2C_SR1; i2csr1 = I2C_SR3; I2C_DR = Byte_addr; while(I2C_SR1_bit.BTF == 0); i2csr1 = I2C_SR1; I2C_CR2_bit.START = 1;//I2C1->CR1 |= I2C_CR1_START; while(I2C_SR1_bit.SB == 0); i2csr1 = I2C_SR1;//SR1.AF?? I2C_DR = (char)(subaddr | 0x01); while(I2C_SR1_bit.ADDR == 0); i2csr1 = I2C_SR1; i2csr1 = I2C_SR3; while(num) { if(num == 1) { I2C_CR2_bit.ACK = 0; I2C_CR2_bit.STOP = 1; } while(I2C_SR1_bit.RXNE == 0); i2csr1 = I2C_SR1; *buffer = I2C_DR; buffer++; num--; } } |
|
相关推荐
2个回答
|
|
|
如果是同时接了2只24C02芯片,IIC地址可能冲突了
|
|
|
|
|
|
根据你提供的代码和描述,可能导致I2C通信失败的原因有以下几点:
1.地址匹配问题:确保飞线接入的芯片的地址正确,并且与代码中使用的地址匹配。 2.上拉电阻问题:确认飞线接入的芯片的SDA和SCL引脚有合适的上拉电阻,通常为2.2KΩ左右。 3.时钟频率问题:确保I2C总线时钟频率设置正确,与芯片要求的时钟频率匹配。 4.电源供应问题:检查飞线接入的芯片是否有合适的电源供应。 5.信号质量问题:查看信号线路是否干净,没有噪音干扰,并且信号线长度适当(最大应不超过几十厘米)。 6.芯片不支持标准模式:确认飞线接入的芯片是否支持标准模式(100kHz),而非高速模式(400kHz)。 7.其他硬件故障:可能存在硬件故障,如芯片损坏或者飞线接线接触不良等。 解决问题的方法可以进行以下尝试: 1.使用示波器观察I2C总线上的时钟和数据线上的波形,确认是否有信号传输。 2.针对以上可能原因,逐一排查和验证。 3.尝试更换芯片进行测试,确认是芯片本身的问题还是飞线接线问题。 4.适当增加延时,或者尝试更改I2C总线时钟频率进行测试。 5.检查I2C总线的外部电路和连接,确保没有硬件故障。 希望以上内容能帮助你解决问题! |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4207 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3263 浏览 1 评论
2796 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2227 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
15169 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3169浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1943浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2110浏览 3评论
2020浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2218浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-14 13:34 , Processed in 0.750954 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2460