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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版