我使用 I2C1 作为主接收器,I2C2 作为从发送器。 程序如下。 程序总是卡在判断ADDR位上,也就是红色部分。 我是新手。 不知道我对I2C的理解有什么问题,就是跑不了。 这个非常困难。 我很急。 感谢您的帮助。
#
#
u8=0;
u8 i = 0;
u8 标志1=0,标志2=0,=0;
/******************************************************** ***** *****
功能:无效延迟(vu32)
参数:vu32延迟时间
描述:延迟指定时间
返回:无
****************************************************** *****/
无效延迟(vu32)
为(;!= 0;--);
/************************配置函数************************ */
无效(无效)
;
。 = ; //串口的波特率,例如最大4./s
。 = ; //数据字长(8位或9位)
。 = ; //可配置停止位 - 支持 1 或 2 个停止位
。 = ; //无奇偶校验
.ntrol = ; //无硬件流控制
。 = | ; //双工模式,使能发送和接收
(,&);//调用STM32的USART初始化底层函数
(,);
无效(无效)
;
/* I2C */
(I2C1);
。 = ;
。 = ;
。 = 0xA1;
。 = ;
.ess = ;
。 = ;
(I2C1,);
(I2C1,&);
g(I2C1,);
(I2C2);
。 = ;
。 = ;
。 = 0xA2;
。 = ;
.ess = ;
。 = ;
(I2C2,&);
(I2C2,);
/*允许1字节1响应模式*/
g(I2C2,);
/************************GPIO配置函数************************ **/
无效(无效)
;//定义类型结构
。 = |||; //PB.6,PB.7
。 = ;
。 = ; //多路开漏输出
(GPIOB,&);
。 = ; //PA9
。 = ;
。 = ; //复用推挽输出
(GPIOA,&);
。 = ; //PA10
.=G;
(GPIOA,&);
/************************时钟配置函数************************ **/
无效(无效)
md(||1, );//使能GPIOA时钟
md(|, );//启用时钟
/************************功能支持功能************************ **/
int fputc(int ch, FILE *f)
/* 将你的 fputc 放在这里 */
/* 循环直到结束 */
而 ((, ) == 重置)
{}
/* 例如写一个到USART */
(, () ch);
ch;
int fgetc(文件 *fp)
整数通道=0;
while((, ) == 重置)
ch = (int)->DR & 0xFF;
(ch); //回声
ch;
/************************主功能*********************** */
int 主函数(无效)
();
();
();
();
while((I2C1, ));
(I2C1, );//BUSY=0时发送启动条件,进入主模式
while(!(I2C1, ));//发生后读SR1并写DR,(())/* BUSY总线忙,MSL主机模式和SB启动条件已发送标志*/
(I2C1,0xA2,er);//发送地址,最后一位为1为写,最后一位为0为读
while(!(I2C1,));
while((I2C2, ) == 重置);
(I2C2,0xff);
while((I2C1,) == 重置);
=(I2C1);
g(I2C1,);
g(I2C2,);
(I2C1,);
("\r\n%d\r\n",);
同时(1);
.rar