arduino nano和ICP上的MCP3424之间的通信

时间:2019-07-14 02:00:48

标签: arduino i2c arduino-ide

我正在完成一个我的项目,该项目使用MCP3424 i2c 18位ADC和arduino nano来通过NTC热敏电阻测量温度,但是在使用arduino电线库时遇到了麻烦。这是我的第一个使用i2c的项目,因此我对该主题不是很了解,但是我已经仔细阅读了(http://ww1.microchip.com/downloads/en/devicedoc/22088b.pdf)上的MCP3424数据表。 并尝试了许多不同的方法来使其正常工作。我也是这个堆栈交换上的新手,所以如果我的语法不对,请原谅我(我正在尽力而为)。这是到目前为止我在arduino上拥有的代码。

#include<Wire.h>

#define ReadMode 0xDD //Device will output conversion data (7 bits, device address. 1 bit, Read/Write mode)
#define WriteMode 0xDC //Device expects config byte (7 bits, device address. 1 bit, Read/Write mode)
#define ConfigByte18 0x8c //PGA = 1, SPS = 3.75, One-Shot mode, channel 1, initiate new conversion.
#define ConfigByte16 0x88 //PGA = 1, SPS = 15, One-Shot mode, channel 1, initiate new conversion.

void setup() {
  Serial.begin(9600);//Initiate Connection to computer
  Wire.begin();//Initiate Wire library
  Wire.setClock(100000);//make sure clock speed is standard mode
  delay(500);//Allow boot up and settle of ADC
  Wire.beginTransmission(WriteMode);//begin transmission with ADC in Write mode
  Wire.write(ConfigByte18);//configure the ADC with settings found in "ConfigByte18"
  Wire.endTransmission();
  Serial.print("Everything worked\n");

}




void loop() {
  unsigned char x, y, z, a, b, c;
  //Serial.println("Bytes ready to be read:");
  Wire.begin();
  Wire.setClock(100000);//make sure clock speed is standard mode
  Wire.beginTransmission(ReadMode);//begin transmission with ADC in write mode
  Wire.requestFrom(0x6E, 6);//request 6 Bytes of information from MCP3424
  x = Wire.read();//read bytes
  delay(10);
  y = Wire.read();
  delay(10);
  z = Wire.read();
  delay(10);
  a = Wire.read();
  delay(10);
  b = Wire.read();
  delay(10);
  c = Wire.read();
  Serial.print(x);//print bytes
  Serial.print(", ");
  Serial.print(y);
  Serial.print(", ");
  Serial.print(z);
  Serial.print(", ");
  Serial.print(a, HEX);
  Serial.print(", ");
  Serial.print(b, HEX);
  Serial.print(", ");
  Serial.println(c, HEX);
  Wire.endTransmission();
  delay(1000);

}

对我的理解的解释是:在“无效设置”部分中,我以写模式开始发送(请参见数据表第21页以及我的解释图和表5-3),其中涉及开始发送功能。从设备具有0xDC,因为设备地址从1101(预编程)开始,然后是110,因为我有两个Adr引脚连接到+ 5v,最后是0,因为我想更改配置设置。转换为十六进制的0xDC。然后,我向从机发送配置寄存器的信息字节(请参见第18页的5.2节)。我发送0x8C,因为我希望我的设置为PGA = 1,SPS = 3.75,单发模式,通道1,启动新的转换。这应该意味着我需要发送从设备10001100或0x8c。然后,该通信结束,根据第21页,“在第二个字节之后发送的任何字节将被忽略”。然后在循环中,除了现在我以读取方式打开传输外,它以相同的方式开始传输,读取模式的最后一位是0xDD(R / W位)现在为1。然后,我请求六个字节的信息并读取六个字节。如果现在转到数据表的第23页,则可以再次进行操作。在这里,我应该从从机获取三个数据字节,并且随后的每个字节都应重复进行配置寄存器设置。现在,我对前三个数据字节不感兴趣,因为我首先只是想知道如何更改配置设置。相反,arduino打印的是按预期方式从从设备发送的三个数据字节,然后是三个完全相同的值(也如预期的那样),因为它们都应该是配置设置。在后三个字节中打印的是“ 90”。不是我所期望的。现在,我试图弄清楚发生了什么(没有示波器就很难了)。 90从十六进制转换为二进制是10010000,我相信默认设置是(可以在第18页上找到)00001001这可以是默认设置吗?如果有人可以告诉我怎么回事以及如何解决?预先感谢您的帮助,也感谢您抽出宝贵的时间阅读我的问题。

0 个答案:

没有答案