正在尝试从adafruit传感器(sht31d)检索数据。
编译使用GCC的Fio,微控制器是一个atmega328p.
原始Arduino Implementation using Wire,在readTempHum()中:
for (uint8_t i=0; i<6; i++)
{
readbuffer[i] = Wire.read();
}
因为GCC不使用Wire,所以我尝试自己使用fleury i2c填充缓冲区:
for (uint8_t i=0; i<6; i++)
{
if (i==0) //Activate device
{
readbuffer[i] = read8(SHT31_DEFAULT_ADDR);
}
else if (i2c_readAck())
{
readbuffer[i] = i2c_readAck();
}
else
{
readbuffer[i] = i2c_readNak();
}
}
我对read8的意图只是开始接收数据:
uint16_t read8(uint8_t reg)
{
uint16_t val = -1;
if (i2c_start(SHT31_DEFAULT_ADDR<<1 | I2C_WRITE) == 0) //Section 4.2 of datasheet
{
i2c_write((uint8_t)reg);
i2c_stop();
if (i2c_start(SHT31_DEFAULT_ADDR<<1 | I2C_READ) == 0) //Section 4.4 of datasheet
{
val |= ((uint16_t)i2c_readAck());
}
}
return val;
}
这真的很难调试。我几乎不知道这是在哪里,即使在彻底审查了datasheet。输出通过UART使用FTDI是什么。
另外,我用Arduino库测试了这个,在那里它工作得完美无缺,所以一切都连接得很好。
Currently digging through the Wire TWI library to better understand where I'm going wrong..
1条答案
按热度按时间rseugnpd1#
如果它有助于有类似的问题,今天我需要I2C为我的ATMega328P和没有I2C支持在我的ASF为8位AVR(我习惯了AVR32 UC3平台,那里是所有容易得多),所以我决定写我自己的I2C库,因为我发现没有工作或可靠的库...
以下是I2C.h库:
它需要
cpu_delay_us
例程(添加它与ASF向导),也使用CPU时钟定义之前,包括这个例如我的:我用AVR32的LCD1602库测试了它,它工作正常(我花了相当长的时间才让它工作,不得不在停止后添加等待状态,否则I2C失败),所以探测和发送数据到从机正在工作,但我没有I2C传感器可供使用,所以我还不能测试接收...
以下是典型用法:
库本身是简单的阻塞,不使用中断,但它是一个很好的起点。