打印
[技术问答]

HK32F030K6Tx 硬件I2C 从机问题

[复制链接]
9210|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
msq001|  楼主 | 2021-2-5 14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源码如下
void I2C1_Init(void)
{

  I2C_InitTypeDef I2C_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
  RCC_APB1PeriphClockCmd(RCC_APB1ENR_I2C1EN, ENABLE);

  GPIO_InitSet(PI_DSI_HW_I2C_SCL_PIN, GPIO_Mode_AF, GPIO_OType_OD, GPIO_PuPd_UP);
  GPIO_InitSet(PI_DSI_HW_I2C_SDA_PIN, GPIO_Mode_AF, GPIO_OType_OD, GPIO_PuPd_UP);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_1);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_1);

  I2C_DeInit(I2C1);
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Disable;
  I2C_InitStructure.I2C_DigitalFilter = 0; // disable
  I2C_InitStructure.I2C_Timing = 0x002105070; // 0x30E32E44
  I2C_InitStructure.I2C_OwnAddress1 = 0x70;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress= I2C_AcknowledgedAddress_7bit;
  I2C_Init(I2C1, &I2C_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel         = I2C1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd      = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  I2C_ITConfig(I2C1, I2C_IT_TXIS
                   | I2C_IT_RXNE
                   | I2C_IT_ADDR
                   | I2C_IT_NACKF
                   | I2C_IT_STOPF
                   | I2C_IT_TC
                   | I2C_IT_BERR
                   | I2C_IT_ARLO
                   | I2C_IT_OVR
                   | I2C_IT_PECERR
                   | I2C_IT_TIMEOUT, ENABLE);
  I2C_Cmd(I2C1, ENABLE);
}

void I2C1_IRQHandler(void)
{
  volatile uint32_t ISR_Status = I2C1->ISR;
  volatile uint8_t addr = (ISR_Status >> 16) & 0xFE;
  
  I2C1->ICR = 0x3F38;  // clear all interrupt flag

  if((ISR_Status & I2C_ISR_ADDR) != 0) // Slave address matched
  {
  }
  else
  {
     if (addr == 0x70)
    {
      if((ISR_Status & I2C_ISR_RXNE) != 0) // Data register not empt
      {
      }
      else if(( ISR_Status & I2C_ISR_STOPF) != 0) // Stop detected
      {
        I2C1->CR1 |= 0x0001;
      }
      else if( (( ISR_Status & I2C_ISR_NACKF) != 0)
        || (( ISR_Status & I2C_ISR_TC) != 0)
        || (( ISR_Status & I2C_ISR_BERR) != 0)
        || (( ISR_Status & I2C_ISR_ARLO) != 0)
        || (( ISR_Status & I2C_ISR_OVR) != 0)
        || (( ISR_Status & I2C_ISR_PECERR) != 0)
        || (( ISR_Status & I2C_ISR_TIMEOUT) != 0)
        || (( ISR_Status & I2C_ISR_TXIS) != 0)
      )
      {
      }
      if(((ISR_Status & I2C_ISR_DIR) != 0))
      {
         I2C1->TXDR = I2C1->RXDR;
      }
    }
  }
}



问题现象:
程序里面设置的是在中断中直接把 RXDR中的数据发送出去,但是实际上总是有一字节的的延迟,如图中所示,
0x70是从机地址,0x03是HK32从机I2C接收的数据,直接发出去的却是0x02(之前一个字节的数据),下一个字节才变成正常的0x03,  然后又接收到 0x09的数据,第一次发送的却还是之前的0x03,下一个字节才变成 0x09

file:///C:/Users/Administrator/Desktop/2.bmp

是有什么地方配置的不正确吗?

2.bmp (1.51 MB )

2.bmp

使用特权

评论回复

相关帖子

沙发
zhuotuzi| | 2021-2-22 23:03 | 只看该作者
我一般很少用硬件的I2C

使用特权

评论回复
板凳
zhuotuzi| | 2021-2-22 23:04 | 只看该作者
没软件的来的更容易。我是真不会配置。

使用特权

评论回复
地板
勇者无惧你和我| | 2021-2-24 08:58 | 只看该作者
我一般不用硬件的I2C操作,每个芯片的都不一样的,还是习惯于使用软件的I2C来进行模拟的。

使用特权

评论回复
5
勇敢的大白菜| | 2021-2-24 08:59 | 只看该作者
强烈建议楼主使用软件的I2C进行模拟的,硬件的不好用的。

使用特权

评论回复
6
ifxz0123| | 2021-2-24 11:50 | 只看该作者
你参考我这个例程看看
HK32F030MF4P6 硬件IIC从机例程.zip (2.2 MB)

使用特权

评论回复
7
msq001|  楼主 | 2021-3-2 11:00 | 只看该作者
谢谢大家,用的是从机,软件模拟很麻烦,所以不得已才用硬件的。  找了原厂的技术支持提供的demo例程换上能正常使用了。

使用特权

评论回复
评论
laymann 2022-3-2 16:32 回复TA
原厂的demo可以提供下嘛谢谢 
8
ap0405209| | 2021-3-26 21:15 | 只看该作者
ifxz0123 发表于 2021-2-24 11:50
你参考我这个例程看看

请问,有没有主机的例程?

使用特权

评论回复
9
qjp1988113| | 2021-5-11 13:55 | 只看该作者
msq001 发表于 2021-3-2 11:00
谢谢大家,用的是从机,软件模拟很麻烦,所以不得已才用硬件的。  找了原厂的技术支持提供的demo例程换上能 ...

原厂的例程能否分享一下?

使用特权

评论回复
10
单片小菜| | 2021-5-12 11:58 | 只看该作者
使用I2C通讯的话,一直会出现问题的,这个是必然的。一定会有的问题。

使用特权

评论回复
11
pengjinjin| | 2021-7-20 12:30 | 只看该作者
老哥 可否分享下原厂的硬件IIc历程例程

使用特权

评论回复
12
hywno1| | 2021-7-23 17:19 | 只看该作者
可否提供一下硬件IIc例程

使用特权

评论回复
13
cnmm131| | 2021-12-28 09:05 | 只看该作者
从机好像只能用硬件IIC, 请问下这个调试时序的软件是什么

使用特权

评论回复
14
laymann| | 2022-3-2 16:31 | 只看该作者
msq001 发表于 2021-3-2 11:00
谢谢大家,用的是从机,软件模拟很麻烦,所以不得已才用硬件的。  找了原厂的技术支持提供的demo例程换上能 ...

你好 原厂的demo可以提供嘛

使用特权

评论回复
15
chenjun89| | 2022-3-2 20:47 | 只看该作者
先用IO模拟把功能调通

使用特权

评论回复
16
weifeng90| | 2022-3-3 08:06 | 只看该作者
硬件IIC不通?先用IO模拟看看。

使用特权

评论回复
17
hellosdc| | 2022-5-16 09:57 | 只看该作者
硬件I2C有问题吗?

使用特权

评论回复
18
xiaoyaodz| | 2022-5-16 12:44 | 只看该作者
I2c总线一般拿来实现什么功能?

使用特权

评论回复
19
nomomy| | 2022-5-16 13:43 | 只看该作者
硬件I2C能与软件I2C一起用一个I2C通道么

使用特权

评论回复
20
chenci2013| | 2022-5-16 15:50 | 只看该作者
硬件I2C 到底怎么样?

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝