你好,
I could not find any document talking about functionality of the peripherals of 14580 (or others) and how to set them up for different options.
I2C,SPI,A / D,PWM,....等。
有人能点me to such document please?
Keywords:
设备:
嗨sjabir2004,
请查看外围示例应用程序部分(7)的文档UM-B-050,也可以查看外围驱动程序部分(10)中的Doc UM-B-051,以获取外围设备的驱动程序雷竞技安卓下载。
谢谢mt_dialog.
你好,
我已经看到了这些文件。
没有描述外围设备的硬件结构以及如何设置。这些示例无法涵盖所有可能的组合和功能。
请确认缺少此文档。
嗨sjabir2004,
没有关于DA外围设备和开发的API的其他文档,有关任何其他功能的更多信息,可以在DA的数据表中找到。此外,您可能希望查看文档UM-B-005和UM-B-004以检查这些文档是否涵盖了任何其他功能。
谢谢mt_dialog.
示例:我想命令一个sensor with I2C. I need to send command write then eventual read . Read can be of max N bytes.
我不知道如何在I2C寄存器中设置位和字节以发送和接收,因为它不是写在任何地方!。
What functions of the i2c_eeprom example are usable in this case ?
谢谢 !
你好,
I don't believe that the I2C functions of the i2c_eeprom example is a great starting point for a sensor driver. I have been using the example below which better explains how to attack I2C:
/ ****************************************************************************************
*宏
**************************************************************************************** /
// I2C helper macros
#define send_i2c_command(x)setword16(i2c_data_cmd_reg,(x))
#define wait_whille_i2c_fifo_is_full()while(!(getword16(i2c_status_reg)&tfnf))
#define wait_until_i2c_fifo_is_empty(!(getword16(i2c_status_reg)&tfe))
#define wait_until_no_master_actity()(getword16(i2c_status_reg)&mst_actity)
#define wait_for_received_byte()while(!getword16(i2c_rxflr_reg))
/ * ---------------------------------------------------------------------------
|@brief Initializes the I2C interface with the provide slave address
|
|@param [in] slave_address,i2c从地址与之通信
|
|@return void.
---------------------------------------------------------------------------*/
void i2c_init(uint8_t slave_address)
{
//使用作为参数提供的地址初始化I2C
// todo:支持10bit寻址
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); // Slave is disabled
setBits16(i2c_con_reg,i2c_speed,1);//设置速度。标准速度= 1,快速= 2
setbits16(i2c_con_reg,i2c_10bitaddr_master,0);//设置寻址模式。7bit = 0,10bit = 1
setword16(i2c_tar_reg,slave_address&0xff);//设置从设备地址
SetWord16(I2C_ENABLE_REG, 0x1); // Enable the I2C controller
而(getword16(i2c_status_reg)&0x20);//等待I2C主FSM闲置
}
//
/ * ---------------------------------------------------------------------------
|@brief扫描从设备的I2C总线进行奴隶设备
|
|@param [in]扩展,如果为true:响应将包括潜在的i2c从设备ID
|@param[in] remote, originator of the scan command
|
|@return void.
---------------------------------------------------------------------------*/
void i2c_scan(bool扩展,bool remote)
{
char temp_str [255] = {0};
char response_str [255] = {0};
uint8_t response_idx = 0;
// Run through all I2C addresses (7bit addressing only!)
for(Uint8_t i = 0x01; i <0x7f; i ++)
{
//设置下一个从地址
i2c_init(我);
SEND_I2C_COMMAND(0x00 & 0x3FF); // Transmit Address on bus
等待_while_i2c_fifo_is_full();//等待i2c tx fifo已满
send_i2c_command(0x0100&0x3ff);//发送读取寄存器0x00
wait_until_i2c_fifo_is_empty();// Wait until Tx FIFO is empty
wait_until_no_master_actity();//确保大师已完成
//我们是否收到了任何数据?
if(getword16(i2c_rxflr_reg)!= 0)
{
//读取收到的数据(device_id)
uint8_t device_id = 0xff&getword16(i2c_data_cmd_reg);
//如果这是扩展扫描,则报告设备ID以及地址
如果(扩展)
// Extended scan. Report address and register 0x00 (device_id)
sprintf(temp_str, "0x%02X=>0x%02X,",i,device_id);
别的
//正常扫描=>报告地址
Sprintf(Temp_str,“0x%02x,”i);
memcpy(&response_str [response_idx],temp_str,strlen(temp_str));
//警告:如果在总线上提供超过50个I2C设备,则会失败
response_idx + = strlen(temp_str);
}
}
//附加回车返回,LineFeed和“确定”回复
Sprintf(Temp_str,“\ n \ rok”);
memcpy(&response_str[response_idx-1],temp_str,strlen(temp_str));
//显示响应(远程或本地)
respond(response_str,strlen(response_str),remote);
//禁用i2c.
setword16(i2c_enable_reg,0x0);//禁用I2C控制器
setBits16(CLK_PER_REG,I2C_ENABLE,0);//禁用I2C的时钟
}
//
/ * ---------------------------------------------------------------------------
|@brief Send I2C slave memory address
|
|@param[in] address of the I2C slave memory
---------------------------------------------------------------------------*/
void i2c_send_address(uint8_t地址_to_send)
{
send_i2c_command(地址_to_send&0xff);//设置地址LSB,写访问
}
//
/ * ---------------------------------------------------------------------------
|@brief Reads single byte from I2C slave.
|
|@param [in]地址,存储地址读取字节。
|
|@return读字节。
---------------------------------------------------------------------------*/
INT8_T I2C_READ_BYTE(UINT8_T地址)
{
i2c_send_address(地址和0x3FF);
等待_while_i2c_fifo_is_full();// Wait if Tx FIFO is full
send_i2c_command(0x0100&0x3ff);//将R / W位设置为1(读取访问)
wait_until_i2c_fifo_is_empty();//等到I2C TX FIFO空
wait_until_no_master_actity();//确保大师已完成
返回(0xff&getword16(i2c_data_cmd_reg));//获得收到的字节
}
//
/ * ---------------------------------------------------------------------------
|@brief将单个字节写入i2c从属。
|
|@param [in]地址,存储字节写入的内存地址。
|@param [in] wr_data,编写的数据。
|
|@return void。
---------------------------------------------------------------------------*/
void i2c_write_byte(uint16_t地址,uint8_t wr_data)
{
i2c_send_address(address);
等待_while_i2c_fifo_is_full();//等待i2c tx fifo已满
SEND_I2C_COMMAND(wr_data & 0xFF); // Send write data
wait_until_i2c_fifo_is_empty();// Wait until Tx FIFO is empty
wait_until_no_master_actity();// wait until no master activity
}
//
/ * ---------------------------------------------------------------------------{
|@brief从i2c从站读取数据
|
|@param[in] hw_address, HW address of I2C slave device
|@param[in] reg_address, Register address to be read
|@param [in] num_bytes,要读取的字节数
|@param [in]远程,read命令的始发者
|
|@return void.
---------------------------------------------------------------------------*/
void i2c_read(uint16_t hw_address,uint16_t reg_address, uint8_t num_bytes, bool remote)
{
char temp_str [255] = {0};
i2c_init(hw_address);
for(Uint8_t i = 0; i
UINT8_T DATA = I2C_READ_BYTE(REG_ADDRESS + I);
char str [10];
如果(i == 0)
Sprintf(str,“0x%02x”,数据);
别的
Sprintf(str,“,0x%02x”,数据);
Sprintf(Temp_str,“%s%s”,temp_str,str);
}
sprintf(temp_str,"%s\n\rOK",temp_str);
响应(temp_str,strlen(temp_str),远程);
}
//
/ * ---------------------------------------------------------------------------
|@brief Writes data to a register address of an I2C slave
|
|@param[in] hw_address, HW address of I2C slave device
|@param [in] reg_address,注册地址写入
|@param [in]数据,数据写入
|@param [in]远程,read命令的始发者
|
|@return void.
---------------------------------------------------------------------------*/
void i2c_write(uint16_t hw_address,uint16_t reg_address,uint16_t wr_data,bool远程)
{
i2c_init(hw_address);
I2C_WRITE_BYTE(REG_ADDRESS,WR_DATA);
respons_ok(远程);
}
//
我希望这有帮助。
好的,这似乎正在寻找什么。我会试一试。
我不知道为什么你没有在SDK的文档和库中添加这个!!,这个论坛的许多人都会很开心。市场上有这么多的I2C设备,每个I2C设备都有自己的结构和协议。
thank you!
你好,我在哪里找到了这些functions
sprintf(temp_str,"%s\n\rOK",temp_str);
响应(temp_str,strlen(temp_str),远程);
Sorry I mean respond() and respond_ok()
你好,
sprintf is from the stdlib library (just #include "stdlib.h") - really useful when you want to dump data to a user or during debugging.
这两个响应函数只是我已经实现的一组函数,以将数据转储到串行端口。您可以使用UART2和ARCH_PRINTF在代码中执行此操作。
我同意这应该将其添加到文档中 - 用于快速教程的有用材料。
你好,ok , this is clear .
在上面的代码中,
......................
void i2c_write_byte(uint16_t地址,uint8_t wr_data)
{
i2c_send_address(address);
等待_while_i2c_fifo_is_full();//等待i2c tx fifo已满
SEND_I2C_COMMAND(wr_data & 0xFF); // Send write data
wait_until_i2c_fifo_is_empty();// Wait until Tx FIFO is empty
wait_until_no_master_actity();// wait until no master activity
}
The TAR register contains the address of the slave and the DATA_CMD register contains the data to send . i2c_send_address(address) will write the address to the DATA_CMD register and then SEND_I2C_COMMAND(wr_data..) will do the same ! .
这是一个错误还是我错过了什么?
SHould all go through the DATA_CMD_REG? i.e. address of target and data to send?
如果是,则tar_reg位0:7的范围是多少?
什么是以下机制:
1-send one command to a slave?
可以读取,写入,重置命令。
2- Read N. bytes from a slave device?
所有没有中断,只是为了让它变得简单。
谢谢 !
嗨sjabir2004,
IC_TAR寄存器包含从设备的地址,在I2C驱动程序中,设备将首先写入模块的寄存器地址,即它想要读取/写入data_cmd,然后,在data_cmd中放置数据传输。I2C_tar是设备本身的地址,在I2C初始化期间设置了设备地址的设置。
谢谢mt_dialog.
你好
The I2C_TAR contains the address of the i2c DEVICE to which the DA14580 would write to.
data_cmd_reg中包含要与设备进行通信的数据。
当我写入data_cmd_reg任何数据时,在I2C总线上,您首先拥有I2C_TAR_REG,然后是I2C_DATA_REG内容。
如果我将从地址写入data_cmd_reg,你将在公共汽车上有两次的地址!!
如果总线上有单个I2C设备,则需要一次加载tar_reg一次,然后将数据写入data_cmd_reg然后我获取地址 - >发送到设备的数据,
这就是我在内存示波器上看到的。
我在这里错过了什么?
嗨sjabir2004,
What do you mean ? if you write the slave address of the device in the DATA_CMD_REG the module will send the I2C_TAR_REG (which is the address of the module) and then will send the data in the DATA_CMD_REG which is again the address of the module. You just need to initialize the I2C with the device that you want to communicate and and then each time you write something in the DATA_CMD_REG the address of the device will be on the bus followed along with the operation (read/write) followed by the data in the DATA_CMD_REG. After a stop or a restart condition when the i2c will start a new transaction the address of the device will be on the bus again.
谢谢mt_dialog.
你好,
i am using SDK 5.0.4 .in order to check security feature in DA14580 device i have to store bond data in EEPROM. while writing a byte in to EEPROM i am facing a problem of i2c_wait_until_eeprom_ready() function .it affects the debugging.
if((getword16(sys_stat_reg)&dbg_is_up)== dbg_is_up)
__asm(“bkpt#0 \ n”);
my code was shown below like this,
************************************************************************************
/ ************************************************************
*为键数据存储选择内存介质:
*
* - spi flash(#define user_cfg_app_bond_db_use_spi_flash)
* - I2C EEPROM(#define user_cfg_app_bond_db_use_i2c_eeprom)
*- cache only (define nothing)
*
*仅选择一个选项。
************************************************************
* /
#undef user_cfg_app_bond_db_use_spi_flash.
#define USER_CFG_APP_BOND_DB_USE_I2C_EEPROM
静态内联void bond_db_load_ext(void)
{
#f定义(user_cfg_app_bond_db_use_spi_flash)
bond_db_load_flash();
#elif定义(user_cfg_app_bond_db_use_i2c_eeprom)
bond_db_load_eeprom();
#endif
}
#elif定义(user_cfg_app_bond_db_use_i2c_eeprom)
静态void bond_db_load_eeprom(void)
{
uint32_t bytes_read;
i2c_eeprom_init(i2c_slave_address,i2c_speed_mode,i2c_address_mode,i2c_address_size);
i2c_eeprom_read_data((uint8_t *)&bdb, APP_BOND_DB_DATA_OFFSET, sizeof(struct bond_db), &bytes_read);
assert_error(bytes_read == sizeof(struct bond_db));
i2c_eeprom_release();
}
I2C_ERROR_CODE I2C_EEPROM_READ_DATA(UINT8_T * RD_DATA_PTR,UINT32_T地址,UINT32_T大小,UINT32_T * BYTES_READ)
{
uint32_t tmp_size;
if(size == 0)
{
* bytes_read = 0;
return I2C_NO_ERROR;
}
//检查要从a(max_size x 8)I2C EEPROM的读取的最大字节
if (size > I2C_EEPROM_SIZE - address)
{
tmp_size = i2c_eeprom_size - 地址;
* bytes_read = tmp_size;
}
别的
{
tmp_size = size;
* bytes_read = size;
}
if(i2c_wait_until_eeprom_ready()!= i2c_no_error)
{
return I2C_7B_ADDR_NOACK_ERROR;
}
//一次读取32个字节
而(tmp_size> = 32)
{
read_data_single(&rd_data_ptr,地址,32);
地址+ = 32;//更新读取的基本地址
tmp_size - = 32;//更新TMP_SIZE以进行剩余的字节读取
}
if(tmp_size)
{
read_data_single(&rd_data_ptr,地址,tmp_size);
}
return I2C_NO_ERROR;
}
i2c_error_code i2c_wait_until_eeprom_ready(void)
{
uint16_t tx_abrt_source;
//检查是否已收到ACK{
for(Uint32_t i = 0; i
send_i2c_command(0x08);//制作假人
wait_until_i2c_fifo_is_empty();// Wait until Tx FIFO is empty
wait_until_no_master_actity();// Wait until no master activity
tx_abrt_source = GetWord16(I2C_TX_ABRT_SOURCE_REG); // Read the I2C_TX_ABRT_SOURCE_REG register
GetWord16(I2C_CLR_TX_ABRT_REG); // Clear I2C_TX_ABRT_SOURCE register
if ((tx_abrt_source & ABRT_7B_ADDR_NOACK) == 0)
{
return I2C_NO_ERROR;
}
}
return I2C_7B_ADDR_NOACK_ERROR;
}
注意:如果我在Sysram中加载了键数据,则它正常工作。IE,
#undef user_cfg_app_bond_db_use_spi_flash.
#undef USER_CFG_APP_BOND_DB_USE_I2C_EEPROM
请给出一个有价值的建议,以避免这个问题。谢谢。
Hi ajay98,
i2c_wait_until_eeprom_ready()通过发送0x08字节来轮询设备,直到设备用ACK响应。你能在调试模式下运行代码,并指示在哪个点I2c_wait_until_eeprom_ready()代码被困?此外,您使用的是SDK的哪个示例?这是一个定制的实施吗?是否可以在SDK的BLE_APP_SECURY示例中复制它?
我还建议您使用问题创建一个新的论坛线程,因为这是非常旧的。
谢谢,PM_DIALOG.