3204|8

63

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

I2C主机接收--从机发送问题,谢过大神啦,解决送话费 [复制链接]

本帖最后由 woshilee 于 2014-11-26 18:53 编辑

我用STM32F103的I2C1作为主接收器,I2C2作为从发送器,程序如下,程序总是会卡在判断ADDR位那里,就是红色部分,小弟菜鸟,不知道对I2C的理解哪里不对,就是无法运行,很捉急,谢谢大神帮忙了


#include
#include
u8 Getbyte=0;
u8 i=0;
u8 flag1=0,flag2=0,sendflag=0;
/*****************************************************
函数: void Delay(vu32 nCount)
参数: vu32 nCount 延时时间
描述: 延时指定时间
返回: 无
******************************************************/
void Delay(vu32 nCount)
{
    for(; nCount != 0; nCount--);
}

/********************USART1配置函数************************/
void USART1_Config(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;              //串口的波特率,例如115200 最高达4.5Mbits/s
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据字长度(8位或9位)
USART_InitStructure.USART_StopBits = USART_StopBits_1;      //可配置的停止位-支持1或2个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;         //无奇偶校验  
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //双工模式,使能发送和接收  
USART_Init(USART1, &USART_InitStructure);  // 调用STM32的USART初始化底层函数
USART_Cmd(USART1,ENABLE);
}


void I2C_Config(void)
{        
        I2C_InitTypeDef  I2C_InitStructure;
  /* I2C configuration */
        I2C_DeInit(I2C1);
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0xA1;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 400000;
  I2C_Cmd(I2C1, ENABLE);
  I2C_Init(I2C1, &I2C_InitStructure);
        I2C_AcknowledgeConfig(I2C1, ENABLE);        

        
        I2C_DeInit(I2C2);
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0xA2;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 400000;
  I2C_Init(I2C2, &I2C_InitStructure);
        I2C_Cmd(I2C2, ENABLE);
        /*允许1字节1应答模式*/
        I2C_AcknowledgeConfig(I2C2, ENABLE);        
        
}

/********************GPIO配置函数************************/
void GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO_InitTypeDef类型结构体GPIO_InitStructure

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_10|GPIO_Pin_11; //PB.6,PB.7
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;        //复用开漏输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);
        
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);
        
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/********************时钟配置函数************************/
void RCC_Config(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);  //使能GPIOA时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1|RCC_APB1Periph_I2C2, ENABLE);  //使能usart1时钟
}
/********************printf函数支持函数************************/
int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */
    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {}

    /* e.g. write a character to the USART */
    USART_SendData(USART1, (uint8_t) ch);

    return ch;
}
int fgetc(FILE *fp)
{
        int ch = 0;
        
    while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
    {
    }

    ch = (int)USART1->DR & 0xFF;
        
    putchar(ch); //回显        
        return ch;
}


/********************主函数************************/
int main(void)
        {
                RCC_Config();
                GPIO_Config();         
                USART1_Config();
                I2C_Config();

               
                while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
                I2C_GenerateSTART(I2C1, ENABLE);// 在BUSY=0时发送起发送起始条件,进入主模式
                while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));// 发生以后读SR1并写DR,((uint32_t)0x00030001)  /* BUSY总线忙, MSL主模式 and SB起始条件已发送 flag */  
                I2C_Send7bitAddress(I2C1, 0xA2, I2C_Direction_Receiver);//发送地址,最后一位为1写,最后一位为0读
                while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

               
                while(I2C_GetFlagStatus(I2C2, I2C_FLAG_ADDR) == RESET);

                I2C_SendData(I2C2, 0xff);
                while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET);
                Getbyte=I2C_ReceiveData(I2C1);
               
                I2C_AcknowledgeConfig(I2C1, DISABLE);        
                I2C_AcknowledgeConfig(I2C2, DISABLE);                        
                I2C_GenerateSTOP(I2C1, ENABLE);                 
                printf("\r\n%d\r\n",Getbyte);
               
                while(1);

        }
解决了送你十块钱话费,谢了,坐等


I2C_Slave_Send.rar

3.91 MB, 下载次数: 10

此帖出自stm32/stm8论坛

最新回复

搜索的第一条就是,应该是很有参考意义的,毕竟是官方的。 http://www.st.com/web/en/catalog ... _searchtype=keyword   详情 回复 发表于 2014-11-26 12:41
点赞 关注
 

回复
举报

4996

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
STM32的硬件I2C有问题,一般用模拟的比较好,当然也有网友搞定的,你自己在网络上找找。。。。。。。
此帖出自stm32/stm8论坛

点评

恩,看着参考手册编的程序,不知道是哪一点理解错了,这种例子网上没有的  详情 回复 发表于 2014-11-26 10:06
 
个人签名我的博客
 

回复

63

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
zhaojun_xf 发表于 2014-11-26 10:01
STM32的硬件I2C有问题,一般用模拟的比较好,当然也有网友搞定的,你自己在网络上找找。。。。。。。

恩,看着参考手册编的程序,不知道是哪一点理解错了,这种例子网上没有的
此帖出自stm32/stm8论坛
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

4
 
STM的硬件IIC的确很坑
要调试的话,还得上示波器慢慢看波形
软件模拟一下吧
上个文件吧
此帖出自stm32/stm8论坛

点评

上个文件是什么意思呀?  详情 回复 发表于 2014-11-26 11:04
 
个人签名

So TM what......?

 

 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

5
 
给一个参考,上 ST 官网下载 UM1029 手册,里边有两个开发板用 I2C 通讯的例子,你可以参考一下。
此帖出自stm32/stm8论坛

点评

这个文档中没有程序呀,只是简单的说了一下  详情 回复 发表于 2014-11-26 11:10
 
 
 

回复

63

帖子

1

TA的资源

一粒金砂(中级)

6
 
ljj3166 发表于 2014-11-26 10:34
STM的硬件IIC的确很坑
要调试的话,还得上示波器慢慢看波形
软件模拟一下吧

上个文件是什么意思呀?
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

1

TA的资源

一粒金砂(中级)

7
 
Study_Stellaris 发表于 2014-11-26 10:34
给一个参考,上 ST 官网下载 UM1029 手册,里边有两个开发板用 I2C 通讯的例子,你可以参考一下。

这个文档中没有程序呀,只是简单的说了一下
此帖出自stm32/stm8论坛

点评

搜索的第一条就是,应该是很有参考意义的,毕竟是官方的。 http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF258336?s_searchtype=keyword  详情 回复 发表于 2014-11-26 12:41
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

8
 
woshilee 发表于 2014-11-26 11:10
这个文档中没有程序呀,只是简单的说了一下

搜索的第一条就是,应该是很有参考意义的,毕竟是官方的。
http://www.st.com/web/en/catalog ... _searchtype=keyword
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

1

TA的资源

一粒金砂(中级)

9
 
Study_Stellaris 发表于 2014-11-26 12:41
搜索的第一条就是,应该是很有参考意义的,毕竟是官方的。
http://www.st.com/web/en/catalog/tools/FM1 ...
找到大神所说的程序,但是看起来很长,还看不懂
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表