问题描述
我正在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 (将#修改为@)