大家好
我想用ble_app_peripheral来接受传感器数据,传感器是由I2C来接收的。于是我在user_periph_setup.c下面的set_pad_functions()函数中加入了
GPIO_ConfigurePin(I2C_PORT, I2C_PIN_SCL, OUTPUT, PID_I2C_SCL, false);
GPIO_ConfigurePin(I2C_PORT, I2C_PIN_SDA, OUTPUT, PID_I2C_SDA, false);
然后调试的时候,手机搜索不到设备了……去掉这两行之后又能搜索到设备了。
请问一下这是什么原因
/ *其中,#定义I2C_PORT GPIO_PORT_0
#定义I2C_PIN_SCL GPIO_PIN_0
#定义I2C_PIN_SDA GPIO_PIN_1
已经写在了别的头文件并引用了。*/
设备:
你好,
搜不到广播,怀疑是程序触发断言了。请检查以下项目:
1,是否在空白GPIO_reservations (void)函数中储备了IIC的GPIO
2,是否在periph_init()中初始化了IIC
3, IIC的GPIO是否已经被其它外设使用了。
如果还不的行,请用JLINK进行调试、调试方法,可参照文档:https://support.dialog-semiconductor.com/system/files/resources/Training..。
嗨
我使用官网的“SDK 5.0.4 \ DA1458x_SDK \ 5.0.4 \ target_apps \ \项目模板\ empty_peripheral_template”项目利用提供的i2c_eeprom.c中的读写函数,操作传感器,使用
凯尔调式发现有时候能正确获取传感器数据,有时候程序会进入NMI_HandlerC函数中__asm(“BKPT # 0 \ n”);死掉不动。你在上面回复的三条能检查了,没有错误。根据你上面答复的参照文档:https://support.dialog-semiconductor.com/system/files/resources/Training...找到问题在GetWord16 (I2C_CLR_TX_ABRT_REG);/ /清楚I2C_TX_ABRT_SOURCE登记”“详细内容见附件,
请问我该如何解决这个问题??
你好,
应该是你IIC驱动有问题造成阻塞,导致程序在那里死等,从而触发看门狗而进NMI_Handler。请先在外设工程中用逻辑分析仪等工具调试IIC时序到能与传感器正常,稳定通讯,再将该传感器驱动移植到你的工程中使用。
你好,能大致说下可能造成阻塞的原因吗?是硬件原因还是软件原因可能性大些,IIC的函数直接使用的是官网的程序,没有做任何改动。
请帮助分析下可能阻塞的原因,该如何解决呢?大部分时候iic是能正常通信,有时候就一直不能通信,时好时坏。
你好
通信时好时坏,说明驱动时序还是有问题;有可能是软、硬件问题。
如果是软件问题:
你需要仔细阅读下传感器的数据表,里面一般都会描述数据读,写的波形。用逻辑分析仪抓波形,和数据表里的波形进行仔细比对,看是否有异常;
另外,需要注意传感器复位、上电后是否需要延时;发指令后是否需要等待其进行一些采样、处理再读结果;读传感器数据的时候是连续读还是字节读;等类似影响到通讯时序的细节
如果是硬件问题:
注意IIC信号线是否有上拉电阻,阻值是否正确;
传感器是否与芯片良好共地;
如果是用杜邦线跳线,注意线材是否连通性良好;
可先使用低速时钟进行尝试。
你好!
关于软件问题:
通过示波器分析发现i2c_eeprom.c文件中i2c_wait_until_eeprom_ready函数中多个一个(的发送指令
源代码为:i2c_error_code i2c_wait_until_eeprom_ready(空白)
{
uint16_t tx_abrt_source;
//检查是否收到ACK
For (uint32_t I = 0;我< I2C_MAX_RETRIES;我+ +)
{
SEND_I2C_COMMAND (();//创建虚拟访问
WAIT_UNTIL_I2C_FIFO_IS_EMPTY ();//等待Tx FIFO为空
WAIT_UNTIL_NO_MASTER_ACTIVITY ();//等待没有主活动
tx_abrt_source = GetWord16 (I2C_TX_ABRT_SOURCE_REG);//读取I2C_TX_ABRT_SOURCE_REG寄存器
GetWord16 (I2C_CLR_TX_ABRT_REG);//清除I2C_TX_ABRT_SOURCE寄存器
if ((tx_abrt_source & ABRT_7B_ADDR_NOACK) == 0);
{
返回I2C_NO_ERROR;
}
}
返回I2C_7B_ADDR_NOACK_ERROR;
}
我改成
i2c_error_code i2c_wait_until_eeprom_ready(空白)
{
GetWord16 (I2C_CLR_TX_ABRT_REG);//清除I2C_TX_ABRT_SOURCE寄存器
返回I2C_NO_ERROR;
}
其它的不变。把i2c中的I2C_FAST模式改为I2C_STANDARD模式,示波器产生的波形和传感器数据表波形一致,发送数据和接收数据也正确。但是
还会出现通讯时好时坏,用凯尔调式的时候坏的概率还小点,把程序完全烧录到epprom坏的可能性大些。在外设调式时暂时还没发现问题。
传感器复位后有延时,一个字节或多个字节读都可以。
初始化函数为:i2c_eeprom_init (HSPPAD_ADDRESS、I2C_STANDARD I2C_7BIT_ADDR, I2C_1BYTE_ADDR);
硬件问题:
两个上拉电阻都是4.7 k,这次的产品是量产品,全部都是工厂机贴,传感器与芯片共地。
由于时间紧急还请多多帮忙!
你好,
可留下联系方式,我们有技术工程师帮你审查PCB设计