你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 F103与51单机进行I2C通信

[复制链接]
smulngy 提问时间:2015-3-24 22:36 /
  现有一个项目,因为其他串口应用很多,无奈打算采取I2C与51单片机通讯,
想法是,51单片机做主,STM32做从,通过硬件接收中断获取51单片机的数据,但现在无法接收到数据,却在中断循环判断。寻求大侠们帮助,STM32代码如下:


#define I2C1_OWN_ADDRESS7  0xA0
#define I2C_Speed          222222;

void I2C1_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        I2C_InitTypeDef  I2C_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        /* 使能与 I2C1 有关的时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  

  /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;               // 开漏输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       


  /* I2C 配置 */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 =I2C1_OWN_ADDRESS7;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
       
        I2C_ITConfig(I2C1,I2C_IT_EVT | I2C_IT_BUF, ENABLE);  //开启I2C1中断的事件、缓存中断

  /* 使能 I2C1 */
  I2C_Cmd(I2C1, ENABLE);

  /* I2C1 初始化 */
  I2C_Init(I2C1, &I2C_InitStructure);
       
       
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;      //使能USART2的IRQ通道()
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}



/*****************************************************************
函数功能 :I2C1接收中断

******************************************************************/
void I2C1_EV_IRQHandler(void)
{
        switch(I2C_GetLastEvent(I2C1))
        {
                case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED :   //接收到匹配的地址数据
                {
                        break;
                }
                case I2C_EVENT_SLAVE_BYTE_RECEIVED :
                {
                        if(I2C1_Rx_Idx < I2C1_BufferSize)
                        {
                                I2C1_Buffer_Rx[I2C1_Rx_Idx] = I2C_ReceiveData(I2C1);
                        }
                       
                        break;
                }
                case I2C_EVENT_SLAVE_STOP_DETECTED :
                {
                        I2C_ClearFlag(I2C1 , I2C_FLAG_STOPF);
                        I2C1_Flag = 1;
                        printf("i2c\r\n");  
                        break;
                }
                default:
                {
                        break;
                }
        }
}


收藏 评论8 发布时间:2015-3-24 22:36

举报

8个回答
_ilikerome_ 回答时间:2015-3-25 07:01:28
51单片机做主,STM32做从

LZ这是神马情况,这样分配合理么。。。
数码小叶 回答时间:2015-3-25 08:41:49
没这样干过
数码小叶 回答时间:2015-3-25 08:42:16
帮顶吧,顺便学习学习
zfz0122 回答时间:2015-3-25 08:48:24
不懂帮顶 3.gif
jeff-392288 回答时间:2015-3-25 09:29:12
用PS2协议试试哈
zhangdaijin 回答时间:2015-3-25 09:32:06
看看学习一下
stary666 回答时间:2015-3-25 10:03:25
帮顶吧,顺便学习学习
回答时间:2015-3-25 10:18:50
进入了中断,楼主看一下中断寄存器的值

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版