打印
[应用相关]

主从硬件IIC

[复制链接]
185|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2021-1-5 14:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采用STM8S003F硬件I2C进行双机通讯,两个片子都使用内部16M,从机采用中断方式进行接收和发送数据(官方DEMO),主机是调用库函数向从机传数据。在主机里第一步就是检测总线是否忙,结果一直处于总线忙状态,从机也没有进入中断,硬件检查没接错线,是什么原因呢?   
while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY))  ;                 // 等待总线释放    主机卡在这一直总线忙,从机进不了中断


从机初始化:

void main(void)
{
  Init_Clk();
  Init_IO();
  Init_Timer();
  Init_I2C();

  enableInterrupts();

while(1)
{;
}
}
void Init_Clk(void)
{
  //  CLK_DeInit();
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    CLK_HSICmd(ENABLE);         // 内部时钟默认8分频
//    CLK_HSECmd(ENABLE);         
}

void Init_I2C(void)
{
     I2C_DeInit();
     I2C_Init(I2C_FREQUENCY, SLAVE_ADDRESS, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
     I2C_ITConfig( (I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE);
     I2C_Cmd(ENABLE);
}
中断:
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{

  if ((I2C->SR2) != 0)          // 读I2C错误,清状态位。
  {
    I2C->SR2 = 0;

    state1 = I2C_SR1;
    state2 = I2C_SR3;
    I2C_CR2 |= 0x04;

    LedStatus(1);       // Test
  }

  WORD Event = I2C_GetLastEvent();
  switch (Event)
  {
      /******* Slave transmitter ******/
      /* check on EV1 */
    case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:
      Tx_Idx = 0;
      break;

      /* check on EV3 */
    case I2C_EVENT_SLAVE_BYTE_TRANSMITTING:
      /* Transmit data */
      I2C_SendData(Slave_Buffer_Rx[Tx_Idx++]);
      break;


      /******* Slave receiver **********/
      /* check on EV1*/
    case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:      // 清接受地址
      //  Rx_Idx = 0;
          I2C->SR1;
          I2C->SR3;
      break;

      /* Check on EV2*/
    case I2C_EVENT_SLAVE_BYTE_RECEIVED:
      Slave_Buffer_Rx[Rx_Idx] = I2C_ReceiveData();

      break;

      /* Check on EV4 */
    case (I2C_EVENT_SLAVE_STOP_DETECTED):
            /* write to CR2 to clear STOPF flag */
            I2C->SR1;
            I2C->CR2 |= I2C_CR2_ACK;
      break;

    default:
     break;
  }

}




主机:
void main(void)
{

  Init_Clk();
  Init_IO();
  Init_Timer();
  Init_I2C();

  enableInterrupts();

  IIC_WriteByte(SLAVE_ADDRESS, DATA_ADDRESS,TestDataIIC);

  while (1)
  {
      Test();
  }

}

void Init_Clk(void)
{

    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    CLK_HSICmd(ENABLE);         

}


void Init_I2C(void)
{
     I2C_DeInit();

     I2C_Init(I2C_FREQUENCY, SLAVE_ADDRESS, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);

      I2C_ITConfig( (I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF), DISABLE);  //禁用中断
     I2C_Cmd(ENABLE);

}



void IIC_WriteByte(BYTE bDevice_ID, BYTE bwrite_Data_address, BYTE bData)   
{

    while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY))  ;                 // 等待总线释放    主机卡在这一直总线忙,从机进不了中断

    I2C_GenerateSTART(ENABLE);                                  // 开始信号
    while( !I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT))  ;      // 等待应答 EV5
    I2C_Send7bitAddress(bDevice_ID, I2C_DIRECTION_TX);          // 写选择芯片地址
    while( !I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))  ;  // 等待应答 EV6
    I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
    I2C_SendData(bwrite_Data_address);                          //  写芯片起始地址
    while( !I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING) )  ;// 等待应答 EV8
    I2C_SendData(bData);                                        //  写数据
    while( !I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED) ) ; // 等待应答 EV8_2

    I2C_GenerateSTOP(ENABLE);                                   // 停止信号

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1510

主题

4547

帖子

6

粉丝