我工作在DA14580 Pro开发工具包(DA14580DEVKT-P_VC)和使用DA14580ATDP-P子板
我需要发送数据收到了从智能手机到适合于外部设备通过I2C连接,并最终得到I2C数据从外部设备通过祝福寄给智能手机
我目前在一个示例程序展示第一部分工作,也就是说,
smaprtphone - >祝福- > DA14580 - > I2C - >外部设备
我开始从ble_app_peripheral示例程序,还添加了UART特性(按我以前的问题的答案:https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。)
它可以正确接收数据从祝福,也显示接收到的祝福UART终端上的数据
我增加了
静态孔隙test_write_byte (uint32_t地址,uint8_t字节){…}
函数从I2C eepm示例代码到这个项目,我调用这个函数我收到祝福后的数据如下:
空白user_server_rx_data_ind_handler (ke_msg_id_t const是否,
struct custs1_val_write_ind const *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
arch_printf(“在函数% s r \ n \”, __func__);
/ /做的操作:显示数据
for (int i = 0;ilength;我+ +){
arch_printf (“\ tparam - >值(% d) = % d (0 x %) \ n \ r”,我,param - >价值[我],param - >价值[我]);
}
/ / 2018-02-12:I2C bytre发送代码(BLE EZAIRO)
/ /发送数据的一部分接收字节数组I2C奴隶地址
arch_printf(“写入I2C:添加:% d值:% d r \ n \”, I2C_SLAVE_ADDRESS, param - >值((param - >长度)- 1));
test_write_byte (I2C_SLAVE_ADDRESS param - >值((param - >长度)- 1));
arch_printf (“I2C数据发送完成\ n \ r”);
}
如果我不叫test_write_byte(. .),接收的数据从UART bie是显示正确
我看到的问题:https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-da..。
因为我有同样的问题,建议我增加了
# undef CFG_WDOG
在da1458x_config_basic.h, and also added the GPIO I2C pin configuration functions in periph_init() in user_periph_setup.c
GPIO_ConfigurePin (I2C_GPIO_PORT I2C_SCL_PIN,输入、PID_I2C_SCL假);
GPIO_ConfigurePin (I2C_GPIO_PORT I2C_SDA_PIN,输入、PID_I2C_SDA假);
然而,现在当我运行这个程序,它停在
如果(! (GPIO_status & (((uint64_t) 1 < <销)< <(港口* 16))))
__asm (“BKPT # 0 \ n”);/ /这个销先前从未被保留!
# endif / / GPIO_DRV_PIN_ALLOC_MON_DISABLED
在gpio.c
从堆栈跟踪我可以看到它正在引起
GPIO_ConfigurePin (I2C_GPIO_PORT I2C_SDA_PIN,输入、PID_I2C_SDA假);
什么是我的代码的问题,我怎么能I2C功能添加到ble_app_peripheral示例程序?
(编辑添加,请见下文我如何解决这个问题,让我knpow如果我的方法是正确的;我还附加一个问题)
下面给出一些参考:
在user_periph_setup.h I2C相关常数定义
#定义I2C_EEPROM_SIZE 0 x20000 / / eepm字节数
#定义I2C_EEPROM_PAGE 256 / / eepm页面大小的字节
/ / # define I2C_SPEED_MODE I2C_FAST / / 1:标准模式(100 kbits / s), 2:快速模式(400 kbits / s) / / 2018-02-12:源自
#定义I2C_SPEED_MODE I2C_STANDARD
#定义I2C_ADDRESS_MODE I2C_7BIT_ADDR / / 0: 7位寻址,1:10位寻址
/ / # define I2C_ADDRESS_SIZE I2C_2BYTES_ADDR / / 0: 8位内存地址,1:16位内存地址,3:24位内存地址/ / 2018-02-13:源自
#定义I2C_ADDRESS_SIZE I2C_1BYTE_ADDR
/ / 2018-02-12:I2C相关常数
/ /选择I2C设置
#定义I2C_GPIO_PORT GPIO_PORT_0
#定义I2C_SCL_PIN GPIO_PIN_2
#定义I2C_SDA_PIN GPIO_PIN_3
#定义I2C_SLAVE_ADDRESS 0 x2
我的空虚user_app_init user_peripheral(空白)函数。c是
空白user_app_init(空白)
{
arch_printf(“进入% s(检查这只叫一次)\ n \ r”, __func__);
app_param_update_request_timer_used = EASY_TIMER_INVALID_TIMER;
/ /初始化制造商特定的数据
mnf_data_init ();
/ / 2018-02-12:I2C初始化
i2c_eeprom_init (I2C_SLAVE_ADDRESS I2C_SPEED_MODE、I2C_ADDRESS_MODE I2C_ADDRESS_SIZE);/ / I2C_ADDRESS_SIZE对I2C程序可能并不重要
arch_printf (“i2c_eeprom_init()调用完成\ n \ r”);
default_app_on_init ();
}
推荐- - - - - -编辑- - - - - -
芯片的问题停止被添加线固定
#定义GPIO_DRV_PIN_ALLOC_MON_DISABLED
在user_periph_setup。h,但现在看到发出I2C数据通过sci和SDA针是不正确的
我怀疑这是某种I2C初始化的问题,我的大多数I2C相关代码复制直接从i2c_eeprom ble_app_peripheral程序示例程序。我连接示波器曲线正确I2C信号和I2C信号,我从当前的应用程序。具体地说,我认为在SDA是不正确的数据模式,和sci和SDA是继续呆在低I2C发送完成后。请让我知道如果这是一个I2C初始化相关的问题。我不认为有任何硬件和布线的问题。
嗨mahaju,
有两种不同的模式,您可以使用,发展模式和生产模式。这是配置的#定义CFG_DEVELOPMENT_DEBUG
如果这是定义,这意味着你在发展模式得到一个警告当你试图使用GPIO没有保留特定的功能。这是为了保护用户定义GPIO的多种功能,并确保它是注意到。但是如果你命令取消这个标志,系统不会崩溃,继续执行。
然而,建议你把它定义在发展模式和避免警告,所有您需要做的就是添加一个RESERVE_GPIO调用GPIO_reservations(空白)在user_periph_setup.c。一旦你生产只需undefCFG_DEVELOPMENT_DEBUG国旗。它通过了GPIO_DRV_PIN_ALLOC_MON_DISABLED不推荐。
试着测试这个先看看这与您的i2c实现解决问题。
如果不,那么花user_i2c驱动程序文件从我们的无代码的实现(从下面的链接访问),并将其复制到user_app空间和使用这个驱动程序API。这样我们可以隔离问题是与司机API使用或其他实现。
https://support.dialog-semiconductor.com/connectivity/reference-design/smartbond-codeless-serial-link
最好的,
LC_Dialog
你好,谢谢你的回复
我增加了RESERVE_GPIO召集GPIO_reservations user_periph_setup.c (void)
这是我的函数是什么样子:
# ifdef CFG_DEVELOPMENT_DEBUG
空白GPIO_reservations(空白)
{
/ *
*全球保留GPIOs预订
* /
/ *
*特定于应用程序的GPIOs预订。使用仅在开发模式(如果DEVELOPMENT_DEBUG #)
即。
RESERVE_GPIO (DESCRIPTIVE_NAME GPIO_PORT_0、GPIO_PIN_1 PID_GPIO);/ /储备P_01通用I / O
* /
# ifdef CFG_PRINTF_UART2
RESERVE_GPIO (UART2_TX UART2_TX_GPIO_PORT、UART2_TX_GPIO_PIN PID_UART2_TX);
RESERVE_GPIO (UART2_RX UART2_RX_GPIO_PORT、UART2_RX_GPIO_PIN PID_UART2_RX);
# endif
RESERVE_GPIO (LED、GPIO_LED_PORT GPIO_LED_PIN PID_GPIO);
/ / 2018-02-14:I2C别针
RESERVE_GPIO (I2C_SCL I2C_GPIO_PORT、I2C_SCL_PIN PID_I2C_SCL);
RESERVE_GPIO (I2C_SDA I2C_GPIO_PORT、I2C_SDA_PIN PID_I2C_SDA);
}
# endif / / CFG_DEVELOPMENT_DEBUG
我也重新启用看门狗定时器使用
#定义CFG_WDOG
在da1458x_config_basic.h
这个项目不会停止,但I2C模式仍然是错误的
我会添加user_i2c司机从无代码的实现,但我只是想知道最好定义或未定义的看门狗定时器
你好,我有一个后续问题
我已经添加了user_i2c api形成无代码示例程序
最初,我所做的是复制user_i2c。c和user_i2c。h在我的项目的src文件夹中,包括在凯尔,然而,它造成了很多编译错误,所以我添加了一些头文件和代码更新其他. c和. h文件,直到所有编译器错误是固定的
然而,I2C输出仍不为我工作
在SDA行整体模式看起来是正确的,但在sci行,最后一个时钟脉冲,一个应该引起ACK毕竟数据被发送到外部I2C设备,只有在很长的时间间隔
我将附加一个示波器显示我是什么意思的图片,和完整的项目文件夹,因为我有很多文件中做了很多改变,很难解释
一些重要的变化(与I2C):
user_cmd_interpreter。c(注释掉代码部分相关命令,因为我也;t需要那么他们导致编译器错误由于一些符号未定义)
user_periph_setup.c(added the functions GPIO_ConfigurePin(...) in set_pad_functions(void){...})
da1458x_config_basic。h(添加# undef CFG_WDOG)
user_custs1_impl。c(使用函数user_i2c_write(…)发送数据获得适合于I2C设备)
user_peripheral。c (I2C初始化在user_app_init(空白)通过调用函数user_i2c_config (7 1 8);)
在附图我发送数据0 0 x2 xc4 I2C设备地址
这个项目可能会出现什么问题?
嗨Mahaju,
我调查这个问题。但我只是想找出是I2C奴隶设备,您使用的是这里是什么电压VDD / VDDIO你操作这个吗?请让我知道。
此外,尽管这是隐式的,但你也可以确认如果你使用I2C线路上拉电阻和这些电阻的值是什么?
最好的,
LC_Dialog
I2C设备Ezairo 7110音频DSP
我用3.3 V的输出发展局I2C通信(Ezairo芯片有一个单独的I2C VDD销,和它有另一个主电源销(1.5 V))
我不确定,但据我所知他们上拉电阻应该建在Ezairo芯片本身,我是一个对自己的价值不确定但我将检查Ezairo数据表,当我回到我的办公室
I2C总线上拉电阻的值1 k
嗨Mahaju,
延迟道歉。
你能确认这个问题是否仍然存在或是解决。
当你提到你正在使用的3.3 v开发工具包,是VBAT J5销23日?
我有测试i2c司机清洁项目,它工作正常站在我这一边。我建议你先测试其他的i2c通信仅是免费的依赖性。然后您可以添加BLE组件。
最好的,
LC_Dialog
很抱歉
是的这个问题已经解决
这是许多东西的结合,在这里详细一点困难,但问题是固定non-the-less
的3.3 v我用销1 J5专家董事会(DA14580DEVKT-P)
我的E-da14580devkt-p_vb_schematic参考文档。pdf页7/9,照片贴上“I / O突破——在所有必要可用
然而,既然你提到它,我只是注意到销23 J5 VBAT_580_M标签
这是销1一样吗?
嗨mahaju,
很高兴知道它已经解决了。如果你可以精心设计的问题是什么,至少主要原因,这将极大地帮助他人经历相同的问题在未来。
关于别针,是的,他们是一样的。然而,当您使用销23 J5的外部组件,那么权力分析器(Pro开发工具包)也可以显示该组件的功率消耗在分析器图SmartSnippets工具箱。
最好的,
LC_Dialog
你好,谢谢你的回应
我一直从事其他事情之后我完全不记得事情的所有细节,我试过了,很多问题是由于认识不足的样本项目代码
然而,我要提到的一个重要的事情是,我以前提供的代码
https://support.dialog-semiconductor.com/documentation
作为我的基础,而不是i2c eepm也无代码实现的版本
同时,i2C数据写功能我用略有不同
提供的I2C写函数
空白i2c_write (uint16_t hw_address, uint16_t reg_address, uint16_t wr_data)
{
i2c_init (hw_address);
i2c_write_byte (reg_address wr_data);
/ / respond_ok(远程);
}
但是我用的是
空白i2c_write_mine (uint16_t hw_address, uint16_t wr_data)
{
i2c_error_code_mine return_code = I2C_7B_ADDR_NOACK_ERROR_MINE;
i2c_init (hw_address);
WAIT_WHILE_I2C_FIFO_IS_FULL ();/ /等待如果I2C Tx FIFO
SEND_I2C_COMMAND (wr_data & 0 xff);/ /发送读0 x00登记
WAIT_UNTIL_I2C_FIFO_IS_EMPTY ();/ /等待Tx FIFO是空的
WAIT_UNTIL_NO_MASTER_ACTIVITY ();/ /确保主已经完成
}
我做了这个通过一些想法形成i2c_scan()函数,因为i2c_write()不为我工作
嗨……我用一个逻辑分析仪用于测试通信序列。我希望有人另一个想法,因为我没有这样的。我将与一个示波器试试,看看我能得到类似的东西。
快速完整的pcb组装服务
嗨ElsetDesai,
谢谢你的评论。然而,你能请注明你的问题是关于对话框BLE解决方案?
谢谢,PM_Dialog