微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正确设置Arduino零上的I2C引脚通常为保留引脚

如何解决正确设置Arduino零上的I2C引脚通常为保留引脚

我正在Atmel Studio的SAMD21上使用Arduino 0内核。我有一个I2C设备连接到引脚PB02(Arduino零引脚19)和PB03(Arduino零引脚25)。附带说明一下,这种完全相同的设备在常规电线(sercom3,20,21)上正常工作。 我要做的第一件事是通过使用PIN_LED_RXL注释掉部分来禁用RX灯针。

然后,我尝试了典型的:

TwoWire myWire(&sercom5, 19, 25 ); //create an I2C on SERCOM5,PA16,PA17
    
void setup(){
    //...
    myWire.begin(); //pressure sensor 1
    pinPeripheral(19, PIO_SERCOM_ALT); //change functionality of PIO,SDA1

    pinPeripheral(25, PIO_SERCOM_ALT); //SCL1
    //...
    
//...
}

然后我尝试从I2C组件中读取4:

      unsigned int recv[4] = {0};
    
          
      myWire.requestFrom(INTERFACE_ADDR,4,1); //get 4 bytes of data

      while(ps1_wire.available()){
        recv[i++] = ps1_wire.read();
      }

并且结果始终为0。我没有收到响应,它告诉我从设备发送了一个NACK-INTFLAG.MB(总线中断使能主设备)位已置1,并且没有数据。数据寄存器。

很奇怪,当我将引脚的pinperipherals设置为PIO_SERCOM_ALT时,PB02的PINCFG寄存器(引脚19)未正确设置-输入使能(INEN)仍被设置并且驱动强度(DRVSTR)尽管设置了MUX使能(PMUXEN),但未将其驱动为高电平。我知道pinPeripheral()并没有设置DRVSTR或INEN,但是它使我认为此引脚或其他引脚上发生了其他事情,可能会影响它在启用芯片期间在其他地方充当I2C的能力。 。

PMUX寄存器设置正确,并指示MUX设置3,根据数据表,该设置对于SERCOM5 PAD [0]和PAD [1]是正确的-它是MUX功能D(第34页)。

Sercom寄存器的初始化看起来不错。为了很好,我确实更改了variant.h以包含用于I2C的Sercom5中断:

#define WIRE_INTERFACES_COUNT 2  
#define PIN_WIRE_SDA         (20u)
#define PIN_WIRE_SCL         (21u)
#define PERIPH_WIRE          sercom3
#define WIRE_IT_HANDLER      SERCOM3_Handler
static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;

#define PIN_WIRE1_SDA               (19u)
#define PIN_WIRE1_SCL               (25u)
#define PERIPH_WIRE1                sercom5
#define WIRE1_IT_HANDLER        SERCOM5_Handler
static const uint8_t SDA1 = PIN_WIRE1_SDA;
static const uint8_t SCL1 = PIN_WIRE1_SCL;

仍然面临相同的问题-调用requestFrom()时设备无法获取返回数据。

如果有人对我尝试使用这些引脚的方式以及如何使I2C在Sercom5的PB02和PB03上有任何了解,我将非常感谢您的帮助。

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。