完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
尝试使用582的硬件I2C读取从机寄存器,但是发现会卡在mode_select,不知道该如何解决了
代码参考了: http://www.wch.cn/index.php/bbs/thread-86122-1.html http://bbs.eeworld.com.cn/thread-1196656-1-1.html voidi2c_read_reg(uint8_taddr,uint8_treg,uint8_tdata_len,uint8_t*data) { uint8_ti=0; printf(“busy1 ”); while(I2C_GetFlagStatus(I2C_FLAG_BUSY)!=RESET) ; printf(“busy2 ”); I2C_GenerateSTART(ENABLE); printf(“modeselect1 ”); while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)) ; printf(“modeselect2 ”); I2C_Send7bitAddress(addr,I2C_Direction_Receiver); printf(“rmodeselect1 ”); while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) ; printf(“rmodeselect2 ”); if(I2C_GetFlagStatus(I2C_FLAG_TXE)!=RESET) { printf(“sendreg ”); I2C_SendData(reg); } printf(“rmodeselect1 ”); while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) ; printf(“rmodeselect2 ”); if(data_len==1) { I2C_GenerateSTOP(ENABLE); printf(“I2C_FLAG_RXNE1 ”); if(I2C_GetFlagStatus(I2C_FLAG_RXNE)!=RESET) { printf(“I2C_FLAG_RXNE2 ”); *data=I2C_ReceiveData(); } } else { while(i《(data_len)) { if(I2C_GetFlagStatus(I2C_FLAG_RXNE)!=RESET) { data[i]=I2C_ReceiveData(); i++; if(i==(data_len-1)) { I2C_GenerateSTOP(ENABLE); } } } } } intmain() { uint8_tlen=0; interr=0; SetSysClock(CLK_SOURCE_PLL_32MHz); /*配置串口1:先配置IO口模式,再配置串口*/ GPIOA_SetBits(GPIO_Pin_9); GPIOA_ModeCfg(GPIO_Pin_8,GPIO_ModeIN_PU);//RXD-配置上拉输入 GPIOA_ModeCfg(GPIO_Pin_9,GPIO_ModeOut_PP_5mA);//TXD-配置推挽输出,注意先让IO口输出高电平 UART1_DefInit(); printf(“hello ”); GPIOB_ModeCfg(GPIO_Pin_13|GPIO_Pin_12,GPIO_ModeIN_PU); I2C_SoftwareResetCmd(ENABLE); I2C_SoftwareResetCmd(DISABLE); I2C_Init(I2C_Mode_I2C,100000,I2C_DutyCycle_16_9,I2C_Ack_Enable,I2C_AckAddr_7bit,0x01); I2C_StretchClockCmd(ENABLE); I2C_Cmd(ENABLE); uint8_t*da; i2c_read_reg(0x12,0x00,1,da); printf(“data:%02x ”,da); }main.zip 根据串口打印信息,是卡在了I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED 从机芯片使用的是qma7981 寄存器如下,代码是读chip-id,在esp32平台测过可以读取,硬件无问题。 |
|
相关推荐
2个回答
|
|
根据v307的代码改了一下,但还是不能用
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf) { u8 i=0; I2C_AcknowledgeConfig(ENABLE ); I2C_GenerateSTART( ENABLE ); while( !I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT ) ) ; I2C_Send7bitAddress((addr << 1) | 0X00,I2C_Direction_Transmitter); //发送器件地址+写命令 while( !I2C_CheckEvent( I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) ); //等待应答 I2C_SendData(reg); //写寄存器地址 I2C_GenerateSTART( ENABLE ); while( !I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT ) ); I2C_Send7bitAddress(((addr << 1) | 0x01),I2C_Direction_Receiver);//发送器件地址+读命令 while( !I2C_CheckEvent( I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ) ); //等待应答 while(i < len) { if( I2C_GetFlagStatus( I2C_FLAG_RXNE ) != RESET ) { if(i == (len - 2)) { I2C_AcknowledgeConfig(DISABLE ); buf = I2C_ReceiveData(); //读数据,发送nACK } else { buf = I2C_ReceiveData(); //读数据,发送ACK } i++; } } I2C_GenerateSTOP( ENABLE ); //产生一个停止条件 return 0; } 现象: |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
533 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2908 浏览 2 评论
2403 浏览 1 评论
879浏览 2评论
694浏览 1评论
riscv-none-embed-objcopy: \'PWM_Output.elf\': No such file这个咋解决,
423浏览 1评论
537浏览 1评论
请教一下,Mounriver 编译不成功:找不到库文件,怎么整
820浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 23:27 , Processed in 1.024916 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号