打印
[STM8]

硬件I2C问题

[复制链接]
1528|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flyman613|  楼主 | 2016-8-11 23:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采用STM8S003F硬件I2C进行双机通讯,两个片子都使用内部16M,从机采用中断方式进行接收和发送数据(官方DEMO),主机是调用库函数向从机传数据。在主机里第一步就是检测总线是否忙,结果一直处于总线忙状态,硬件检查没接错线,是什么原因呢?
沙发
mintspring| | 2016-8-12 00:02 | 只看该作者
看看是不是初始化函数没有弄对。

使用特权

评论回复
板凳
643757107| | 2016-8-12 09:06 | 只看该作者
如果你确认硬件没错就看看软件的初始化 ,如果还没错就是芯片坏了。

使用特权

评论回复
地板
icecut| | 2016-8-12 10:10 | 只看该作者
总线忙是多 master 的新功能.你单向传输,应该不在乎.但是,你看看它 iic 是不是默认多主模式.如果是这样,初始化之前,时钟引脚不应该为低.

使用特权

评论回复
5
flyman613|  楼主 | 2016-8-12 15:20 | 只看该作者
本帖最后由 flyman613 于 2016-8-12 15:26 编辑
mintspring 发表于 2016-8-12 00:02
看看是不是初始化函数没有弄对。

从机初始化:

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);                                   // 停止信号
}


使用特权

评论回复
6
ideafor| | 2016-8-12 16:56 | 只看该作者
你把i2c的速率降低了试试能不能初始化成功

使用特权

评论回复
7
flyman613|  楼主 | 2016-8-12 17:54 | 只看该作者
ideafor 发表于 2016-8-12 16:56
你把i2c的速率降低了试试能不能初始化成功

目前用的是100K,系统时钟采用的是内部16M,我初始化程序没问题吧?

使用特权

评论回复
8
bbapple| | 2016-8-13 09:19 | 只看该作者
总线忙状态,硬件检查没接错线,像这种情况最好确定下初始化是否有问题呢

使用特权

评论回复
9
handleMessage| | 2016-8-13 09:31 | 只看该作者
STM8S003F硬件I2C进行双机通讯问题,传数据出现了问题,总线传输函数不知道是怎么写的呀

使用特权

评论回复
10
flyman613|  楼主 | 2016-8-17 13:17 | 只看该作者
ideafor 发表于 2016-8-12 16:56
你把i2c的速率降低了试试能不能初始化成功

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);

}
有问题吗?

使用特权

评论回复
11
lovecat2015| | 2016-8-17 20:35 | 只看该作者
一个做主机,一个做从机,先把速率调低一些

使用特权

评论回复
12
Stannis| | 2016-8-17 20:55 | 只看该作者
总线忙,检查对应的引脚状态啊

使用特权

评论回复
13
Thor9| | 2016-8-17 21:33 | 只看该作者
检查时钟引脚状态

使用特权

评论回复
14
wahahaheihei| | 2016-8-17 23:18 | 只看该作者
从机是不是一直占据着控制权,让从机初始化。

使用特权

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

本版积分规则

5

主题

19

帖子

0

粉丝