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

stm8l051 I2C从机发送问题 为什么主机一直收到的是0xff

[复制链接]
stm0newer 提问时间:2017-7-26 11:41 /
void main(void)
{
  /* Infinite loop */
  CLK_LSICmd(ENABLE);//使能LSI
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI);//RTC时钟源LSI,1分频=38K
  while (CLK_GetFlagStatus(CLK_FLAG_LSIRDY) == RESET);//等待LSI就绪
  CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);

  I2C_DeInit(I2C1);
  I2C_Init(I2C1, 4000, 0x51,I2C_Mode_I2C, I2C_DutyCycle_2,I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);
  /* Enable Error Interrupt*/
  I2C_ITConfig(I2C1, (I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE);

  USART_DeInit(USART1);
  CLK_PeripheralClockConfig (CLK_Peripheral_USART1,ENABLE);//开启USART时钟
  USART_Init(USART1,9600,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,(USART_Mode_TypeDef)USART_Mode_Tx|USART_Mode_Rx);//设置USART参数9600,8N1,接收/发送
  USART_Cmd (USART1,ENABLE);
  enableInterrupts();//使能中断

  while (1)
  {
  }
}
INTERRUPT_HANDLER(I2C1_SPI2_IRQHandler,29)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
  u8 temp = 0;
    if (I2C1->SR1&0x02)//地址已经匹配(读SR1,SR3清除该位)
    {
      I2C_GetITStatus(I2C1,I2C_IT_ADDR);
        temp = I2C1->SR3&0x07;
        USART1_SendStr("匹配地址\n");
    }
    else if ((I2C1->SR1&0x84)&&(I2C1->SR3&0x04))//数据字节传送完
    {
      I2C_GetITStatus(I2C1,I2C_IT_BTF);
        temp = 0xA0;    //假设这里发送0xA5
        I2C1->DR = temp;
        I2C_GenerateSTOP(I2C1,ENABLE);
        USART1_SendStr("数据发完 等待发送\n");
    }
    else if ((I2C1->SR1&0x40)&&(0 == (I2C1->SR3&0x04)))//接收时数据寄存器
    {
        temp = I2C1->DR;    //读取数据寄存器
        USART_SendData8(USART1,temp);
        USART1_SendStr("数据发完 等待读取\n");
    }
    else if (I2C1->SR1&0x10)//检测到停止位
    {
        I2C1->CR2 = I2C1->CR2;//清除停止位
        I2C_GenerateSTOP(I2C1,ENABLE);
        USART1_SendStr("检测到停止位\n");
    }
    //错误处理
    if (I2C1->SR2&0x01)//总线错误
    {
        I2C1->SR2 &= ~0x01;//清零
        USART1_SendStr("总线错误\n");
    }
    else if(I2C1->SR2&0x02)//仲裁失败
    {
        I2C1->SR2 &= ~0x02;//清零
        USART1_SendStr("仲裁失败\n");
    }
    else if(I2C1->SR2&0x04)//应答失败
    {
        I2C1->SR2 &= ~0x04;//清零
        USART1_SendStr("应答失败\n");
    }
    else if(I2C1->SR2&0x08)//上溢、下溢
    {
        I2C1->SR2 &= ~0x08;//清零
        USART1_SendStr("上溢下溢\n");
    }

    USART1_SendStr("中断结束\n");
    return;



}



收藏 评论2 发布时间:2017-7-26 11:41

举报

2个回答
stm0newer 回答时间:2017-7-26 13:07:07
来个人啊
sssdd 回答时间:2017-7-27 13:56:38
远程芯片没响应。或者,协议没对上,或者,对面芯片供电有问题。要嘛,芯片坏啦。。
时序问题居多。IIC不建议用自带的。协议兼容性差。看半天规格书,不如重写个IO模拟的。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版