11个帖子/ 0新
最后一篇
arun chettoor.
离线
最后一次露面:6年4个月前
加入:2014-06-21 08:20
I2C代码

我正在使用I2C总线接口进行加速度计。加速度计的数据表坚持要在特定时间发送开始条件以获取数据。因此,在软件中,在I2C部分中的开始和停止条件是什么程序或代码是什么。是否可以知道启动条件是否已在总线上成功传输。如果是这样,我应该监控的注册。我正在使用专家开发板,并为SCL和SDA引脚使用P00和P01。谢谢!

dialog_hm.
离线
最后一次露面:7个月1周前
加入:2014-04-01 16:07
嗨arun,

嗨arun,

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

它的工作方式如下所示:

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

例如通过I2C读取XOUT(见MC3410-SPEC)。
■开始
■地址(= 0x4C + R/W = 0)
■数据0x0d.
■重启
■地址(= 0x4c + r / w = 1)
■数据IN0(地址= 0x0D)
■数据IN1(地址= 0x0E)...通过自动增加
■停止

现在我们必须将此转换为工作计划:
请参阅用户手册UM-B-004

... //主要计划的一部分

#define XOUT0 0x0D // bit 0
#define xout1 0x0e // bit 8 ... 15 array [1]
#define ADDRESS-IIC 0x4C // MC3410的iic-address

unsigned char array [2];

......

i2c_eeprom_init(地址-IIC,i2c_7bit_addr,i2c_1byte_addr);
i2c_eeprom_read_data(数组XOUT0 2);

//数据存储在阵列[0](LSB)和阵列[1](MSB)中

......

我希望这很清楚它是如何工作的。

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

arun chettoor.
离线
最后一次露面:6年4个月前
加入:2014-06-21 08:20
嗨,谢谢你的回复。

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

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

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

但是代码在上面陷入上面,部分,它无法检测到或者它不会产生起始字节。当传感器数据表说明时,我连接了一切,我只是从传感器那里得到确认。我也尝试了循环,以持续触发IC_tar,但仍然是相同的输出。

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

我当前的init序列是:

setbits16(clk_per_reg,i2c_enable,1);//为i2c启用时钟
setword16(i2c_enable_reg,0x0);//禁用I2C控制器
setword16(i2c_con_reg,i2c_master_mode | i2c_slave_disable | i2c_restart_en);//从站被禁用
setBits16(i2c_con_reg,i2c_speed,speed);//设置速度100
//设置bits16 (I2C_CON_REG, I2C_10BITADDR_MASTER, address_mode);//从7位开始没有设置寻址模式
setword16(i2c_tar_reg,gc_or_start |特殊|(dev_address&0x3ff));//将起始位和特殊位添加到1,以便发送开始到加速度计。
SetWord16 (I2C_ENABLE_REG 0 x1);//开启I2C控制器
而((getword16(i2c_status_reg)&0x20)!= 0);

arun chettoor.
离线
最后一次露面:6年4个月前
加入:2014-06-21 08:20
你能帮助我吗?

你能帮助我吗?

dialog_hm.
离线
最后一次露面:7个月1周前
加入:2014-04-01 16:07
你好,阿伦,

你好,阿伦,

我今天会检查你的信息。

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

HM问好

dialog_hm.
离线
最后一次露面:7个月1周前
加入:2014-04-01 16:07
嗨arun,

你好,阿伦,

阅读ADXL345手册,以下是重要的:
* CS =高
*如果alt_address = high => 0x3a = write和0x3b =读取
*如果alt_address = low => 0xa6 = write和0xa7 =读取
*对SDA和SCL线的上拉电阻使用适当的值(例如4K7)
* adxl345 = 0xe5的ID代码。这可以读取芯片,检查协议是否有效。

最好的问候,嗯

arun 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);//检测起始字节是否已经发送

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

arun chettoor.
离线
最后一次露面:6年4个月前
加入:2014-06-21 08:20
经过输出引脚

在初始化PIN作为I2C外围设备后,通过DA14580的输出引脚进行,发现它没有提供任何信号。请给我一个测试代码以启动I2C代码的开始条件。

dialog_hm.
离线
最后一次露面:7个月1周前
加入:2014-04-01 16:07
你好,阿伦,

你好,阿伦,

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

HM.

arun 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,0x06);

但是,虽然我正在运行调试器,但我知道这些行正在使代码重定向到硬件_Handler.c和部分:
if((getword16(sys_stat_reg)&dbg_is_up)== dbg_is_up)
__asm(“bkpt#0 \ n”);

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

dialog_hm.
离线
最后一次露面:7个月1周前
加入:2014-04-01 16:07
你好

你好

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

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

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

/ *测试定义 - 选择与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硬件_configuration_index(1)// 1 => I2C

* * *步骤3。

添加新软件:EEPROM_TEST.C(在文件的开头)

挥发性int16_t温度;
挥发性㈡

//测试外围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号:
II = I2C_EEPROM_READ_BYTE(0x05);//测试读数ID值= 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);//在AddRes29开始...地址57 = 29个位置

通过RD_DATA读取变量[0] ... rd_data [28]

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

{HM}

主题锁定