你好,我使用的是DA14580,现在我想用UART接口将我的DA14580与另一个单片机连接,可以使用哪些端口引脚?我的DA14580也使用了I2C-EEPROM。
谢谢,asmaitha
你好,我没有使用外部处理器配置的DA1458x,但是/ keil_Projects / proximity / eporter_fe /中有和示例
我认为您可以通过GPIO多路复用来选择UART的引脚配置。请参阅文件periph_setup.cn(在μVision的项目视图中的Arch文件夹中)您有GPIO_CONFIGUREPIN函数。以上引脚配置,您还必须保留IO(开发时)。这是通过Letail_GPIO宏完成的。
最好的问候,vesa
你好,视频电子设备标准协会,谢谢你提供的详情。我的怀疑是,任何端口上的任何PIN可以用作UART引脚吗?我也对SPI同样怀疑吗?P1_0,P1_1,P1_2引脚可以EB使用串行CLK,串行数据,串行芯片选择引脚?
是否有文档描述每个引脚可以支持哪些不同的功能?
谢谢asm
根据数据表,您可以在任何端口上使用UART(http://support.dialog-semiconductor.com/resource/da14580-datasheet第7页)
属下做输出。UART传输数据。映射到Px端口URX DI输入。UART接收数据。映射到Px端口urts进行输出。UART请求发送。映射到Px端口开普敦大学DI输入。UART清除发送。映射到Px端口UTX2做输出。UART 2传输数据。映射到Px端口URX2 DI输入。UART 2接收数据。映射到Px端口URTS2做输出。UART 2发送请求。映射到Px端口UCTS2 DI输入。UART 2清除发送。映射到Px端口
这同样适用于SPI总线
SPI_CLK进行输入/输出。SPI时钟。映射到Px端口SPI_DI DI输入。SPI数据输入。映射到Px端口SPI_DO进行输出。SPI数据输出。映射到Px端口SPI_EN DI输入。SPI时钟启用。映射到Px端口
查看其他PIN映射的数据表。请注意,模拟接口使用固定映射。
谢谢!
你好,视频电子设备标准协会,非常感谢。现在我明白了,只要我们在peripher_setup .h文件中适当初始化这些引脚,任何Px引脚都可以配置为SPI接口引脚。但根据DA14580数据表SPI仅支持8/16/32位模式传输,但我的从站的寄存器数据尺寸为24位。在此方案中传输数据。
谢谢soujanya.k.
嗨Soujanya。K,
那么我猜你可以使用8位模式:SetBits16 (SPI_CTRL_REG SPI_WORD SPI_MODE_8BIT);//设置为8位模式
SetBits16 (SPI_CTRL_REG SPI_WORD SPI_MODE_8BIT);//设置为8位模式
并在3个8位块块中进行读写操作:uint8_t write_buf [] = {0x01,0x02,0x03};Const int chunk_size = 24/8;Int c = 0;而(c {SetWord16 (SPI_RX_TX_REG0 * write_buf + +);//写入设备,自增后做{} whiled(getBits16(spi_ctrl_reg,spi_int_bit)== 0);//虽然RX寄存器为空
uint8_t write_buf [] = {0x01,0x02,0x03};Const int chunk_size = 24/8;Int c = 0;而(c {SetWord16 (SPI_RX_TX_REG0 * write_buf + +);//写入设备,自增后做{} whiled(getBits16(spi_ctrl_reg,spi_int_bit)== 0);//虽然RX寄存器为空
SetWord16 (SPI_CLEAR_INT_REG, 1);/ /清楚SPI_INT_BITc++;/ /增加c}
类似的东西,我还没有测试过!!
PS.如果你想同时读取,你需要这样做read_buf = GetWord16(SPI_RX_TX_REG0) & 0xff;用0xff屏蔽只是为了确保没有不需要的数据到达。这个方法有点棘手,你需要使用缓冲区…我从未遇到过SPI块大小为24位的设备
我在短时间内没有提出其他想法
你好,视频电子设备标准协会,非常感谢。幸运的是,我正在使用的芯片不允许读取操作i.e.没有MISO信号。所以我只需要执行SPI_Write操作。
你好,
我有一个包含3Differ控制寄存器的从站,根据我的SPI从设备数据表在每个SPI_WRITE操作之后,我需要在我做一个SPI_WRITE之前等待10MSEC:spi_write (register1、数据);延迟(10毫秒);spi_write (register2、数据);延迟(10毫秒);
我如何引入这个10毫秒的延迟?
asmatha你好,
您可以使用内核定时器。
app_msg.
APP_EVENT_TIMER
int timer_handler(ke_msg_id_t const msgs,void const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
{app_event_timer,(ke_msg_func_t)app_event_timer_handler}
ke_timer_set
ke_timer_clear
注意:这是内核计时器,它有点不准确,但我想应该工作。至少,您可以先尝试一下。
你好,视频电子设备标准协会,非常感谢你的帮助。
我真的很抱歉,但我理解如何定义和调用timer_handler在我的spi驱动程序文件。请您指导我一些实现的例子。
在DSPS_0示例中的位置 - > DSPS_0 \ DA14580_DSPS_3.150.2 \ DK_APPS \ SRC \ PLF \ RECIP \ SRC \ DREVER \ TIMER中,有一个TIMER.H文件我们可以直接使用这些函数来生成微秒延迟。
是的,看来你可以用timer_wait功能等待最大1000µs,或1ms。
timer_wait
您需要在头文件中定义处理程序函数,然后将其包含在spi驱动程序中。
你好,视频电子设备标准协会,谢谢你提供的信息。
在Peripheral_examples中的一个SDK示例中:我发现(我= 00;< 20;我+ +);这个循环引入了7.6微秒的延迟所以我们可以使用这个循环延迟吗?
建议使用此逻辑吗?
谢谢asmaitha
嗨asmaitha,
如果你需要非常短的延迟,那么是的,我认为使用这个是可以的。
你好VesaN,谢谢,我测试了长达10秒的延迟,不是很准确。我想知道BLE DA14580是否支持多线程概念?我的设想是我有一段时间(1)循环运行,我正在GPIO上注册IRQ(对于一个关键新闻事件),所以当键被按下时,如果while(1)正在执行,那么我们应该跳出while循环,反之亦然。当(1)应该开始执行时,再次按下下一个键)
但我观察到的是,由于(1)循环,我的中断不会被执行。
任何想法如何实现上述逻辑?
多线程究竟是什么意思?在任何情况下,我想这是一个操作系统的问题..
如果配置正确,即使在while(1){}循环中,GPIO中断也应该工作。
我认为你不应该使用while(1)循环,如果你使用SDK。毫无疑问,这个循环会打破它,你会遇到一些奇怪的问题。
你想通过按按钮达到什么目的?也许我们能找到一个比while循环更好的解决方案
你好VesaN,我有一个while(1)循环,它继续在SPI上写特定的数据到我的从设备。我在P0_7上有一个键,所以当我按下这个键时,它会变低,反弹周期为10毫秒,从而产生中断。我将中断注册为:GPIO_RegisterCallback (GPIO0_IRQn keysweep_callback);gpio_enableirq(gpio_port_0,gpio_pin_7,gpio0_irqn,1,1,10);
在我的回调中:
空白keysweep_callback(空白){
如果(Key_sweep_status = = 1)key_sweep_status = 0;其他的key_sweep_status = 1;}
在我当(1){if(key_sweep_status == 1)/*做相关的动作*/其他的打破;}
但是我遇到的是,一旦控制进入while(1)循环,即使我按下“keysweep_callback”键也不会被调用。
你好,
我没有使用外部处理器配置的DA1458x,但是/ keil_Projects / proximity / eporter_fe /中有和示例
我认为您可以通过GPIO多路复用来选择UART的引脚配置。请参阅文件periph_setup.cn(在μVision的项目视图中的Arch文件夹中)您有GPIO_CONFIGUREPIN函数。以上引脚配置,您还必须保留IO(开发时)。这是通过Letail_GPIO宏完成的。
最好的问候,vesa
你好,视频电子设备标准协会,
谢谢你提供的详情。
我的怀疑是,任何端口上的任何PIN可以用作UART引脚吗?我也对SPI同样怀疑吗?
P1_0,P1_1,P1_2引脚可以EB使用串行CLK,串行数据,串行芯片选择引脚?
是否有文档描述每个引脚可以支持哪些不同的功能?
谢谢
asm
根据数据表,您可以在任何端口上使用UART(http://support.dialog-semiconductor.com/resource/da14580-datasheet第7页)
这同样适用于SPI总线
查看其他PIN映射的数据表。请注意,模拟接口使用固定映射。
谢谢!
你好,视频电子设备标准协会,
非常感谢。
现在我明白了,只要我们在peripher_setup .h文件中适当初始化这些引脚,任何Px引脚都可以配置为SPI接口引脚。
但根据DA14580数据表SPI仅支持8/16/32位模式传输,但我的从站的寄存器数据尺寸为24位。在此方案中传输数据。
谢谢
soujanya.k.
嗨Soujanya。K,
那么我猜你可以使用8位模式:
SetBits16 (SPI_CTRL_REG SPI_WORD SPI_MODE_8BIT);//设置为8位模式
并在3个8位块块中进行读写操作:
{
uint8_t write_buf [] = {0x01,0x02,0x03};
Const int chunk_size = 24/8;
Int c = 0;
而(c
SetWord16 (SPI_RX_TX_REG0 * write_buf + +);//写入设备,自增后
做{
} whiled(getBits16(spi_ctrl_reg,spi_int_bit)== 0);//虽然RX寄存器为空
SetWord16 (SPI_CLEAR_INT_REG, 1);/ /清楚SPI_INT_BIT
c++;/ /增加c
}
类似的东西,我还没有测试过!!
PS.如果你想同时读取,你需要这样做read_buf = GetWord16(SPI_RX_TX_REG0) & 0xff;用0xff屏蔽只是为了确保没有不需要的数据到达。这个方法有点棘手,你需要使用缓冲区…我从未遇到过SPI块大小为24位的设备
我在短时间内没有提出其他想法
你好,视频电子设备标准协会,
非常感谢。
幸运的是,我正在使用的芯片不允许读取操作i.e.没有MISO信号。
所以我只需要执行SPI_Write操作。
谢谢
asm
你好,
我有一个包含3Differ控制寄存器的从站,
根据我的SPI从设备数据表在每个SPI_WRITE操作之后,我需要在我做一个SPI_WRITE之前等待10MSEC:
spi_write (register1、数据);
延迟(10毫秒);
spi_write (register2、数据);
延迟(10毫秒);
我如何引入这个10毫秒的延迟?
谢谢,
asmaitha
asmatha你好,
您可以使用内核定时器。
app_msg.输入文件app_api.h描述你的时间,例如,APP_EVENT_TIMER.int timer_handler(ke_msg_id_t const msgs,void const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id).将函数定义也添加到头文件中!这个函数必须对文件可见app_task_handlers.h{app_event_timer,(ke_msg_func_t)app_event_timer_handler}.如果需要,请添加特定配置文件包括条件。ke_timer_set设置计时器。ke_timer_clear.注意:这是内核计时器,它有点不准确,但我想应该工作。至少,您可以先尝试一下。
你好,视频电子设备标准协会,
非常感谢你的帮助。
我真的很抱歉,但我理解如何定义和调用timer_handler在我的spi驱动程序文件。
请您指导我一些实现的例子。
在DSPS_0示例中的位置 - > DSPS_0 \ DA14580_DSPS_3.150.2 \ DK_APPS \ SRC \ PLF \ RECIP \ SRC \ DREVER \ TIMER中,有一个TIMER.H文件我们可以直接使用这些函数来生成微秒延迟。
谢谢,
asmaitha
asmatha你好,
是的,看来你可以用
timer_wait功能等待最大1000µs,或1ms。您需要在头文件中定义处理程序函数,然后将其包含在spi驱动程序中。
你好,视频电子设备标准协会,
谢谢你提供的信息。
在Peripheral_examples中的一个SDK示例中:
我发现
(我= 00;< 20;我+ +);这个循环引入了7.6微秒的延迟
所以我们可以使用这个循环延迟吗?
建议使用此逻辑吗?
谢谢
asmaitha
嗨asmaitha,
如果你需要非常短的延迟,那么是的,我认为使用这个是可以的。
你好VesaN,
谢谢,我测试了长达10秒的延迟,不是很准确。
我想知道BLE DA14580是否支持多线程概念?
我的设想是
我有一段时间(1)循环运行,我正在GPIO上注册IRQ(对于一个关键新闻事件),
所以当键被按下时,如果while(1)正在执行,那么我们应该跳出while循环,反之亦然。当(1)应该开始执行时,再次按下下一个键)
但我观察到的是,由于(1)循环,我的中断不会被执行。
任何想法如何实现上述逻辑?
谢谢,
asmaitha
asmatha你好,
多线程究竟是什么意思?在任何情况下,我想这是一个操作系统的问题..
如果配置正确,即使在while(1){}循环中,GPIO中断也应该工作。
我认为你不应该使用while(1)循环,如果你使用SDK。毫无疑问,这个循环会打破它,你会遇到一些奇怪的问题。
你想通过按按钮达到什么目的?也许我们能找到一个比while循环更好的解决方案
你好VesaN,
我有一个while(1)循环,它继续在SPI上写特定的数据到我的从设备。
我在P0_7上有一个键,所以当我按下这个键时,它会变低,反弹周期为10毫秒,从而产生中断。
我将中断注册为:
GPIO_RegisterCallback (GPIO0_IRQn keysweep_callback);
gpio_enableirq(gpio_port_0,gpio_pin_7,gpio0_irqn,1,1,10);
在我的回调中:
空白keysweep_callback(空白)
{
如果(Key_sweep_status = = 1)
key_sweep_status = 0;
其他的
key_sweep_status = 1;
}
在我当(1)
{
if(key_sweep_status == 1)
/*做相关的动作*/
其他的
打破;
}
但是我遇到的是,一旦控制进入while(1)循环,即使我按下“keysweep_callback”键也不会被调用。
谢谢,
asmaitha