我正在用I2C总线接口连接加速计。加速度计的数据表坚持需要在特定的时间发送启动条件来获取数据。那么在软件的I2C部分中实现启动和停止条件的程序或代码是什么呢?是否有可能知道启动条件是否已经在总线上成功传输。如果是,我应该监控哪个寄存器。我使用专家开发板,scl和sda引脚使用P00和P01。谢谢你!
嗨,阿伦,
Q1您使用了哪些传感器?Q2您是否检查了SDK软件中的Periphiral 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 ... 7数组[0]#define XOUT1 0x0E // bit 8#define地址-IIC 0x4C // IIC-Address的MC3410
unsigned char数组[2];
...
i2c_eeprom_init (ADDRESS-IIC I2C_7BIT_ADDR I2C_1BYTE_ADDR);i2c_eeprom_read_data(array,xout0,2);
array[0] (LSB)和array[1] (MSB)
我希望这很清楚它是如何工作的。
关于软件的建议(在UM-B-004中使用EEPROM-DATA-READ + INFO)正在解决问题。
你好,谢谢你的回复。我使用adxl345作为传感器。我需要生成一个开始字节,在DA1458的数据表中提到,如果设置了SPECIAL和GC_OR_START,写入IC_TAR将生成一个开始字节。所以我写了这个代码:
SETWORD16(I2C_TAR_REG,0xC53); //激活重启 - 11&10位设置,0x53是传感器的7位地址。
而(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// setbits16(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,0x1);//启用I2C控制器while(GetWord16(I2C_STATUS_REG) & 0x20) != 0);
你能帮我吗?
你好arun,
我今天会查你的信息。
您是否使用任何I2C-Protocol-Analyzer?例如Saleae或其他品牌。这样您就真正知道您的软件正在工作。
最好的问候
通过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。这可以读出芯片,以检查协议是否工作。
最好的问候,嗯
非常感谢你的回复。我正在读取ADXL的ID代码,并且开始字节不是发送。我给出了适当的拉动电阻,我只得到了确认。关于你写的任何东西是8位地址。因此,我首先通过在数据表中提到的(在I2C_DATA_CMD_REG上)发送此8位地址来启动代码。但这里的问题是 -* ic_tar仅包含7位和10位寻址的IC_tar。所以这里我不能在阅读和写作之前给出8位地址。所以我在这里给出了7位寻址。这是个问题吗?*在DA14580数据表中,提到,如果我们将写入IC_tar Statte,则将发送特殊(位11)和GC_OR_START(位10)。因此,在设置这些后,应提出开始字节中断。我没有得到它。这是部分 -SETWORD16(I2C_TAR_REG,0xC53); //激活重启 - 11&10位设置,0x53是传感器的7位地址。
你能让我清楚这些点吗?
通过DA14580的输出引脚初始化i2c外设后,发现没有发出任何信号。请给我一个测试代码来启动I2C代码的启动条件。
现在在DESC上有芯片(ADXL345Z)。看看我能做什么,解决你的问题。
嗯
你好,很高兴你得到了IC并为之工作。我让UART正常工作,同样地配置了I2C引脚。我通过示波器来了解任何启动信号是否发生(而SCL(高)SDA(低))。但是明确地知道它不是从配置的I2C引脚中提供任何信号。我们是否需要使用值设置I2C时钟的定时。我的意思是下面:setword16(ic_ss_scl_lcnt,0x08);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”);
请告诉我是否需要解锁任何寄存器值以更改这些值。
嗨
它可以使用I2C EEPROM驱动程序来控制其他I2C应用芯片,非EEPROM。亚博国际官网平台网址温度传感器(SE95)示例如下所示。
* * *步骤1。打开软件:sdk ... \ peripheral_examples ... da14580_peripheral_setup.uvproj
* * *步骤2。看到:periph_setup.h:将硬件_configuration_index(。)更改为'1'。
/* Test Definition -选择匹配你的H/W设置的配置*---------------------------------------------------------*(0)带有UART的SPI闪存*(1)I2C EEPROM与UART*(2)正交编码器与蜂鸣器和uart*---------------------------------------------------------* ///硬件配置<0 => SPI闪存具有UART <1 =>带UART <2 =>正交编码器,定时器和蜂鸣器与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]
我希望这能为您做出,读出加速度传感器。
{嗯}
嗨,阿伦,
Q1您使用了哪些传感器?
Q2您是否检查了SDK软件中的Periphiral 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 ... 7数组[0]
#define XOUT1 0x0E // bit 8
#define地址-IIC 0x4C // IIC-Address的MC3410
unsigned char数组[2];
...
i2c_eeprom_init (ADDRESS-IIC I2C_7BIT_ADDR I2C_1BYTE_ADDR);
i2c_eeprom_read_data(array,xout0,2);
array[0] (LSB)和array[1] (MSB)
...
我希望这很清楚它是如何工作的。
关于软件的建议(在UM-B-004中使用EEPROM-DATA-READ + INFO)正在解决问题。
你好,谢谢你的回复。我使用adxl345作为传感器。我需要生成一个开始字节,在DA1458的数据表中提到,如果设置了SPECIAL和GC_OR_START,写入IC_TAR将生成一个开始字节。所以我写了这个代码:
SETWORD16(I2C_TAR_REG,0xC53); //激活重启 - 11&10位设置,0x53是传感器的7位地址。
而(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
// setbits16(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,0x1);//启用I2C控制器
while(GetWord16(I2C_STATUS_REG) & 0x20) != 0);
你能帮我吗?
你好arun,
我今天会查你的信息。
您是否使用任何I2C-Protocol-Analyzer?例如Saleae或其他品牌。
这样您就真正知道您的软件正在工作。
最好的问候
你好arun,
通过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。这可以读出芯片,以检查协议是否工作。
最好的问候,嗯
非常感谢你的回复。我正在读取ADXL的ID代码,并且开始字节不是发送。我给出了适当的拉动电阻,我只得到了确认。关于你写的任何东西是8位地址。因此,我首先通过在数据表中提到的(在I2C_DATA_CMD_REG上)发送此8位地址来启动代码。但这里的问题是 -
* ic_tar仅包含7位和10位寻址的IC_tar。所以这里我不能在阅读和写作之前给出8位地址。所以我在这里给出了7位寻址。这是个问题吗?
*在DA14580数据表中,提到,如果我们将写入IC_tar Statte,则将发送特殊(位11)和GC_OR_START(位10)。因此,在设置这些后,应提出开始字节中断。我没有得到它。这是部分 -
SETWORD16(I2C_TAR_REG,0xC53); //激活重启 - 11&10位设置,0x53是传感器的7位地址。
而(getBits16(i2c_intr_stat_reg,r_start_det)== 0); //检测开始字节已发送或不发送
你能让我清楚这些点吗?
通过DA14580的输出引脚初始化i2c外设后,发现没有发出任何信号。请给我一个测试代码来启动I2C代码的启动条件。
你好arun,
现在在DESC上有芯片(ADXL345Z)。
看看我能做什么,解决你的问题。
嗯
你好,
很高兴你得到了IC并为之工作。我让UART正常工作,同样地配置了I2C引脚。我通过示波器来了解任何启动信号是否发生(而SCL(高)SDA(低))。但是明确地知道它不是从配置的I2C引脚中提供任何信号。我们是否需要使用值设置I2C时钟的定时。我的意思是下面:
setword16(ic_ss_scl_lcnt,0x08);
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”);
请告诉我是否需要解锁任何寄存器值以更改这些值。
嗨
它可以使用I2C EEPROM驱动程序来控制其他I2C应用芯片,非EEPROM。亚博国际官网平台网址温度传感器(SE95)示例如下所示。
* * *步骤1。打开软件:
sdk ... \ peripheral_examples ... da14580_peripheral_setup.uvproj
* * *步骤2。看到:periph_setup.h:
将硬件_configuration_index(。)更改为'1'。
/* Test Definition -选择匹配你的H/W设置的配置
*---------------------------------------------------------
*(0)带有UART的SPI闪存
*(1)I2C EEPROM与UART
*(2)正交编码器与蜂鸣器和uart
*---------------------------------------------------------
* /
//硬件配置<0 => SPI闪存具有UART <1 =>带UART <2 =>正交编码器,定时器和蜂鸣器与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]
我希望这能为您做出,读出加速度传感器。
{嗯}