11个帖子/ 0个新帖子
最后发表
阿伦Chettoor
离线
最后看到:6年4个月前
加入:2014-06-21 08:20
I2C代码

我正在用I2C总线接口连接加速计。加速度计的数据表坚持需要在特定的时间发送启动条件来获取数据。那么在软件的I2C部分中实现启动和停止条件的程序或代码是什么呢?是否有可能知道启动条件是否已经在总线上成功传输。如果是,我应该监控哪个寄存器。我使用专家开发板,scl和sda引脚使用P00和P01。谢谢你!

Dialog_HM
离线
最后看到:7个月1周前
加入:2014-04-01阿联酋
嗨,阿伦,

嗨,阿伦,

你用的是什么传感器?
Q2你检查sdk软件内的外围I2C部分了吗?

其工作方式如下所示:

我不知道用的是什么芯片,但如果我看MC3410的规格,
情况应如下:

例如,XOUT(见MC3410-spec)是通过I2C读取的。
■开始
■地址(= 0x4C + R/W = 0)
■数据0 x0d
■重启
■地址(= 0x4C + R/W = 1)
数据in0 (address = 0x0D)
■data in1 (address = 0x0E)…通过自动增加
■停止

现在我们必须把它转换成一个工作程序:
参见用户手册UM-B-004

//主程序的一部分

#define XOUT0 0x0D // bit 0
#define XOUT1 0x0E // bit 8
#define ADDRESS-IIC 0x4C // MC3410的iic-address

unsigned char数组[2];

...

i2c_eeprom_init (ADDRESS-IIC I2C_7BIT_ADDR I2C_1BYTE_ADDR);
i2c_eeprom_read_data(数组XOUT0 2);

array[0] (LSB)和array[1] (MSB)

...

我希望大家明白它是如何工作的。

软件的建议(在UM-B-004中使用eeprom-data-read + info)正在解决这个问题。

阿伦Chettoor
离线
最后看到:6年4个月前
加入:2014-06-21 08:20
你好,谢谢你的回复。

你好,谢谢你的回复。我使用adxl345作为传感器。我需要生成一个开始字节,在DA1458的数据表中提到,如果设置了SPECIAL和GC_OR_START,写入IC_TAR将生成一个开始字节。所以我写了这个代码:

SetWord16(I2C_TAR_REG,0xC53);//激活重启-设置11位和10位,0x53为传感器的7位地址。

while(GetBits16(I2C_INTR_STAT_REG,R_START_DET) == 0);//检测起始字节是否已经发送

但代码卡在上面的while部分,它不能检测或它没有产生一个开始字节。我连接一切作为传感器数据表说,我只得到确认从传感器。我还尝试使用while循环不断触发IC_TAR,但输出仍然相同。

传感器需要的序列为:
*开始字节
*编写slaveaddr +写作
*读确认
* write reg addr to be read
*读确认
*读取数据。//这里有问题。没有数据来的RX FIFO,所以检查回来,发现开始字节没有生成。
*读确认
*停止

我当前的init序列是:

SetBits16 (CLK_PER_REG I2C_ENABLE 1);//使能I2C时钟
SetWord16 (I2C_ENABLE_REG 0 x0);//关闭I2C控制器
SetWord16(I2C_CON_REG, I2C_MASTER_MODE | I2C_SLAVE_DISABLE | I2C_RESTART_EN);// Slave被禁用
SetBits16 (I2C_CON_REG, I2C_SPEED,速度);//设置速度为100
//设置bits16 (I2C_CON_REG, I2C_10BITADDR_MASTER, address_mode);//从7位开始没有设置寻址模式
SetWord16(I2C_TAR_REG, GC_OR_START|SPECIAL|(dev_address & 0x3FF));//添加起始位和特殊位到1,用于发送START到加速计。
SetWord16 (I2C_ENABLE_REG 0 x1);//开启I2C控制器
while(GetWord16(I2C_STATUS_REG) & 0x20) != 0);

阿伦Chettoor
离线
最后看到:6年4个月前
加入:2014-06-21 08:20
你能帮我吗?

你能帮我吗?

Dialog_HM
离线
最后看到:7个月1周前
加入:2014-04-01阿联酋
你好,阿伦,

你好,阿伦,

我今天会查你的信息。

您是否使用任何i2c协议分析器?e.g. Saleae或其他品牌。
这样您就真正知道您的软件正在工作。

HM问好

Dialog_HM
离线
最后看到:7个月1周前
加入:2014-04-01阿联酋
嗨,阿伦,

你好,阿伦,

阅读ADXL345手册,以下是重要的:
* CS =高
* if ALT_ADDRESS = high => 0x3A = write and 0x3B = read
* if ALT_ADDRESS = low => 0xA6 = write and 0xA7 = read
*为SDA和SCL线路使用适当的上拉电阻值(例如4k7)
* ADXL345的ID-code = 0xE5。这可以读出芯片,以检查协议是否工作。

最好的问候,嗯

阿伦Chettoor
离线
最后看到:6年4个月前
加入:2014-06-21 08:20
非常感谢你的

非常感谢您的回复。我正在阅读的ID码的ADXL和开始字节不发送。我给出了适当的拉起电阻,我得到的只是确认。关于地址你写的都是8位地址。因此,我通过首先发送这个8位地址(在I2C_DATA_CMD_REG上)开始编写代码,如数据表中所述。但这里的问题是
* IC_TAR只包含7位和10位寻址。所以在这里我不能在读写之前给出8位地址。所以这里我给出了7位的寻址。有问题吗?
*在DA14580数据表中提到,如果我们写入IC_TAR stat字节将被发送,如果特殊(位11)和GC_OR_START(位10)设置。因此,在设置这些之后,应该引发开始字节中断。我不明白。这是
SetWord16(I2C_TAR_REG,0xC53);//激活重启-设置11位和10位,0x53为传感器的7位地址。

while(GetBits16(I2C_INTR_STAT_REG,R_START_DET) == 0);//检测起始字节是否已经发送

请让我把这些要点说清楚好吗?

阿伦Chettoor
离线
最后看到:6年4个月前
加入:2014-06-21 08:20
通过输出引脚

通过DA14580的输出引脚初始化i2c外设后,发现没有发出任何信号。请给我一个测试代码来启动I2C代码的启动条件。

Dialog_HM
离线
最后看到:7个月1周前
加入:2014-04-01阿联酋
你好,阿伦,

你好,阿伦,

有芯片(ADXL345Z)现在在我的desc。
看看我能做什么,来解决你的问题。

阿伦Chettoor
离线
最后看到:6年4个月前
加入:2014-06-21 08:20
你好,

你好,
很高兴你拿到了IC并为它工作。我正在使UART正常工作,类似地,我配置了I2C引脚。我通过示波器来了解是否有任何开始信号(SCL(高)SDA(低))。但是我们知道它并没有从配置的i2c引脚发出任何信号。是否需要设置I2C时钟的计时值。我指的是以下这些:
SetWord16 (IC_SS_SCL_LCNT, ();
SetWord16 (IC_SS_SCL_HCNT 0 x06);

但是当我运行调试器时,我知道这些行正在使代码重定向到hardware_handler.c和section:
if (GetWord16(SYS_STAT_REG) & DBG_IS_UP) == DBG_IS_UP)
__asm(“BKPT # 0 \ n”);

请告诉我是否需要解锁任何寄存器值来更改这些值。

Dialog_HM
离线
最后看到:7个月1周前
加入:2014-04-01阿联酋

它可以使用I2C EEPROM驱动程序来控制其他I2C应用芯片,非EEPROM。亚博国际官网平台网址温度传感器(SE95)示例如下所示。

* * *步骤1。打开软件:
DA14580_peripheral_setup.uvproj . SDK

* * *步骤2。看到:periph_setup.h:
将HARDWARE_CONFIGURATION_INDEX(.)改为' 1 '。

/* Test Definition -选择匹配你的H/W设置的配置
*---------------------------------------------------------
* (0) spi flash memory with uart
* (1) i2c eeprom与uart
*(2)正交编码器与蜂鸣器和uart
*---------------------------------------------------------
* /
//硬件配置<0=> SPI Flash with UART <1=> I2C EEPROM with UART <2=> Quadrature Encoder, Timers & Buzzer with UART
#define HARDWARE_CONFIGURATION_INDEX (1) // 1 => I2C

* * *步骤3。

将新软件添加到:eeprom_test.c(在文件的开头)

挥发性int16_t温度;
不稳定的int二世;

//测试外围SE95温度传感器
//地址= 1001 A2 A1 A0 R/W => 7bitaddress = 0x48…0x48 + 7 = 0x4F

i2c_eeprom_init(0x48, I2C_STANDARD, I2C_7BIT_ADDR, I2C_1BYTE_ADDR);

//读取内部id号:
2 = i2c_eeprom_read_byte (0 x05);//测试读取ID-value = 0xA1

/ /读取温度
BTRD = i2c_eeprom_read_data(rd_data, 0, 2);

温度= 256 * rd_data[0] + rd_data[1];
温度=温度/ 8;//右移3位

/ / * * *

我在加速度传感器上测试了这个软件,它工作了。
只要做正确的连接和填写不同的7位从地址等。

在上面的示例中添加以下行:

i2c_eeprom_init(0x53, I2C_STANDARD, I2C_7BIT_ADDR, I2C_1BYTE_ADDR);
....
BTRD = i2c_eeprom_read_data(rd_data, 29, 29);//从地址29开始…地址57 = 29个地点

通过rd_data[0]读取变量…rd_data [28]

我希望这能让你们,读出加速度传感器。

{嗯}

主题锁定