0

我在带有 Atmel Studio 的 SAMD21 上使用 Arduino Zero 内核。我有一个 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(总线中断启用主设备)位已设置,并且数据寄存器中没有数据。

奇怪的是,当我将引脚的 pinPeripherals 设置为 时PIO_SERCOM_ALT,PB02(引脚 19)的 PI​​NCFG 寄存器没有正确设置 - 输入启用(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 在 PB02 和 PB03 上为 Sercom5 工作有任何见解,我将非常感谢任何帮助。

谢谢!

4

0 回答 0