您好,我正在使用DA14580,现在我想用UART接口上用另一个微控制器连接我的DA14580,可以使用哪个端口引脚?此外,我的da14580正在使用i2c-eeprom。
谢谢,asmaith.
您好,我没有将DA1458x与外部处理器配置一起使用,但在/keil\u projects/proximity/reporter\u fe中有一个示例/
我认为,由于GPIO多路复用,您可以非常自由地选择UART的引脚配置。请参阅文件periph\u setup.c(在µVision的项目视图中的arch文件夹中),其中包含GPIO\u ConfigurePin函数。在上述引脚配置中,还必须保留IO(在开发时)。这是用RESERVE\u GPIO宏完成的。
敬你,维萨
你好Vesa,谢谢你的消息。我的疑问是,任何端口上的任何管脚都可以用作UART管脚吗?我对SPI也有同样的怀疑?P1\ U 0、P1\ U 1、P1\ U 2引脚是否可以使用串行时钟、串行数据、串行芯片选择引脚?
是否有任何文档描述了每个PIN可以支持的不同功能?
谢谢asm.
根据数据表,您可以在任何端口上使用UART(http://support.dialog-seminiondiondiondiondum/resource/da14580-datasheet.,第7页)
UTX进行输出。UART发送数据。映射到PX端口URX DI输入。UART接收数据。映射到PX端口城市轨道交通不输出。要发送的UART请求。映射到Px端口ucts di输入。UART清楚地发送。映射到PX端口UTX2进行输出。UART 2传输数据。映射到PX端口URX2 DI输入。UART 2接收数据。映射到PX端口urts2做输出。UART 2请求发送。映射到PX端口UCTS2 DI输入。UART 2明确发送。映射到PX端口
同样适用于SPI总线
SPI\ U CLK DO输入/输出。SPI时钟。映射到Px端口SPI_DI DI输入。SPI数据输入。映射到PX端口SPI\u DO输出。SPI数据输出。映射到Px端口SPI_EN DI输入。SPI时钟启用。映射到PX端口
有关其他管脚映射,请参见数据表。注意,模拟接口使用固定映射。
谢谢!
你好Vesa,非常感谢。现在我明白任何PX引脚都可以配置为SPI接口引脚,提供了在Periph_setup.h文件中适当地初始化引脚。但根据DA14580数据表,SPI仅支持8/16/32位模式传输,但我的从机在内存中有一个24位的寄存器数据大小。如何在这种情况下传输数据。
谢谢苏贾尼亚,K
嗨soujanya.k,
然后我猜你可以使用8位模式:setbits16(spi_ctrl_reg,spi_word,spi_mode_8bit);//设置为8位模式
setbits16(spi_ctrl_reg,spi_word,spi_mode_8bit);//设置为8位模式
并在三个8位块的块中读取/写入操作:uint8\u t write\u buf[]={0x01、0x02、0x03};const int chunk_size = 24/8;int c = 0;while(c<块大小){setword16(spi_rx_tx_reg0,* write_buf ++);//写入设备,递增后做{}while(GetBits16(SPI_CTRL_REG,SPI_INT_BIT)==0);//当RX寄存器为空时
uint8\u t write\u buf[]={0x01、0x02、0x03};const int chunk_size = 24/8;int c = 0;while(c<块大小){setword16(spi_rx_tx_reg0,* write_buf ++);//写入设备,递增后做{}while(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位的设备
我没有在短时间内想出其他主意
你好Vesa,非常感谢。幸运的是,我使用的芯片,它不允许读取操作,即没有MISO信号。所以我只需要执行SPI_WRITE操作。
您好 ,
我有一个包含3个不同控制寄存器的从机,根据我的SPI从设备数据表,在每次SPI\ U写入操作之后,我需要等待10秒,然后再进行一次SPI\ U写入:SPI_WRITE(register1,数据);延迟(10毫秒);SPI_WRITE(register2,数据);延迟(10毫秒);
如何介绍10毫秒的延迟?
你好,阿斯梅塔,
你可以使用内核定时器。
应用程序消息
app_event_timer.
int timer\u handler(ke\u msg\u id\u t const msgid,void const*param,ke\u task\u id\u t const dest\u id,ke\u task\u id\u t const src\u id)
{APP\u EVENT\u TIMER,(ke\u msg\u func\t)APP\u EVENT\u TIMER\u handler}
ke_timer_set.
ke_timer_clear.
注意:这是内核计时器,它总是有点不准确,但我想它应该可以工作。至少,你可以先试试。
你好Vesa,非常感谢你的帮助。
我真的很抱歉,但我了解如何在我的SPI驱动程序文件中定义和调用Timer_Handler。请您向我指导我一些实施的例子。
在位置-->DSPS\u 0\DA14580\u DSPS\u 3.150.2\dk\u apps\src\plf\refip\src\driver\timer的DSPS\u 0示例中,有一个timer.h文件,我们可以直接使用这些函数来生成微秒延迟。
是的,似乎你可以使用timer_wait.等待最大1000μs或1ms的功能。
timer_wait.
您需要在标题文件中定义处理程序函数,然后将其包含在SPI驱动程序中。
你好Vesa,感谢你的信息。
在以下示例中的一个SDK示例中:我找到for(i = 00; i <20; i ++);该循环介绍了7.6miccro秒的延迟所以我们可以用这个来循环延迟吗?
用这个逻辑明智吗?
谢谢asmaith.
嗨asmaitha,
如果您需要一个非常短的延迟,那么是的,我认为使用它是一个好的。
你好Vesan,谢谢我测试了高达10秒的延迟,它不是如此准确。我有兴趣知道BLE DA14580是否支持多线程概念?我的场景是我有一个while(1)循环正在运行,我正在GPIO上注册一个IRQ(对于按键事件),因此,如果(1)执行键时,按下键,那么我们应该在循环中突破这一点,而反之亦然(即,再次为Next Keypress,(1)应该开始执行)
但我观察到的是,由于while(1)循环,我的中断没有被执行。
你知道如何实现上述逻辑吗?
你说的多线程到底是什么意思?无论如何,我想这是一个操作系统的问题。。
GPIO中断甚至应该工作,即使是在一段时间内(1){}循环,如果已正确配置它们。
如果您使用的是使用SDK,我认为在(1)循环中不应该使用(1)循环。最肯定的是循环将破坏它,你会遇到一些奇怪的问题。
按钮按下的是什么?也许我们可以找到比循环更好的解决方案
你好Vesan,我有一段时间(1)循环,它一直在将特定数据写入SPI到我的从设备。我在P0_7上有一个键,所以当我按下键时,它会带来低于10msec的拍摄时间,从而产生中断。我正在注册中断:gpio_registercallback(gpio0_irqn,keysweep_callback);GPIO\启用IRQ(GPIO\端口\ 0,GPIO\引脚\ 7,GPIO0\ IRQn,1,1,10);
在我的回电中:
void keysweep_callback(void){
if(key_sweep_status == 1)键\扫描\状态=0;其他键\扫描\状态=1;}
在我的同时(1){if(键\扫描\状态==1)/ *是否有关行动* /其他打破;}
但是,我遇到的是,一旦控制进入(1)循环,即使我按下键“keysweep_callback”也没有被调用。
您好,
我没有将DA1458x与外部处理器配置一起使用,但在/keil\u projects/proximity/reporter\u fe中有一个示例/
我认为,由于GPIO多路复用,您可以非常自由地选择UART的引脚配置。请参阅文件periph\u setup.c(在µVision的项目视图中的arch文件夹中),其中包含GPIO\u ConfigurePin函数。在上述引脚配置中,还必须保留IO(在开发时)。这是用RESERVE\u GPIO宏完成的。
敬你,维萨
你好Vesa,
谢谢你的消息。
我的疑问是,任何端口上的任何管脚都可以用作UART管脚吗?我对SPI也有同样的怀疑?
P1\ U 0、P1\ U 1、P1\ U 2引脚是否可以使用串行时钟、串行数据、串行芯片选择引脚?
是否有任何文档描述了每个PIN可以支持的不同功能?
谢谢
asm.
根据数据表,您可以在任何端口上使用UART(http://support.dialog-seminiondiondiondiondum/resource/da14580-datasheet.,第7页)
同样适用于SPI总线
有关其他管脚映射,请参见数据表。注意,模拟接口使用固定映射。
谢谢!
你好Vesa,
非常感谢。
现在我明白任何PX引脚都可以配置为SPI接口引脚,提供了在Periph_setup.h文件中适当地初始化引脚。
但根据DA14580数据表,SPI仅支持8/16/32位模式传输,但我的从机在内存中有一个24位的寄存器数据大小。如何在这种情况下传输数据。
谢谢
苏贾尼亚,K
嗨soujanya.k,
然后我猜你可以使用8位模式:
setbits16(spi_ctrl_reg,spi_word,spi_mode_8bit);//设置为8位模式
并在三个8位块的块中读取/写入操作:
uint8\u t write\u buf[]={0x01、0x02、0x03};
const int chunk_size = 24/8;
int c = 0;
while(c<块大小)
{
setword16(spi_rx_tx_reg0,* write_buf ++);//写入设备,递增后
做{
}while(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位的设备
我没有在短时间内想出其他主意
你好Vesa,
非常感谢。
幸运的是,我使用的芯片,它不允许读取操作,即没有MISO信号。
所以我只需要执行SPI_WRITE操作。
谢谢
asm.
您好 ,
我有一个包含3个不同控制寄存器的从机,
根据我的SPI从设备数据表,在每次SPI\ U写入操作之后,我需要等待10秒,然后再进行一次SPI\ U写入:
SPI_WRITE(register1,数据);
延迟(10毫秒);
SPI_WRITE(register2,数据);
延迟(10毫秒);
如何介绍10毫秒的延迟?
谢谢,
asmaith.
你好,阿斯梅塔,
你可以使用内核定时器。
应用程序消息
键入文件app_api.h.描述你的时间,例如。,app_event_timer.
。int timer\u handler(ke\u msg\u id\u t const msgid,void const*param,ke\u task\u id\u t const dest\u id,ke\u task\u id\u t const src\u id)
。将函数定义添加到标题文件!此函数必须可见文件app_task_handlers.h.{APP\u EVENT\u TIMER,(ke\u msg\u func\t)APP\u EVENT\u TIMER\u handler}
. 如果需要,添加特定的配置文件包含条件。ke_timer_set.
设置计时器。ke_timer_clear.
。注意:这是内核计时器,它总是有点不准确,但我想它应该可以工作。至少,你可以先试试。
你好Vesa,
非常感谢你的帮助。
我真的很抱歉,但我了解如何在我的SPI驱动程序文件中定义和调用Timer_Handler。
请您向我指导我一些实施的例子。
在位置-->DSPS\u 0\DA14580\u DSPS\u 3.150.2\dk\u apps\src\plf\refip\src\driver\timer的DSPS\u 0示例中,有一个timer.h文件,我们可以直接使用这些函数来生成微秒延迟。
谢谢,
asmaith.
你好,阿斯梅塔,
是的,似乎你可以使用
timer_wait.
等待最大1000μs或1ms的功能。您需要在标题文件中定义处理程序函数,然后将其包含在SPI驱动程序中。
你好Vesa,
感谢你的信息。
在以下示例中的一个SDK示例中:
我找到
for(i = 00; i <20; i ++);该循环介绍了7.6miccro秒的延迟
所以我们可以用这个来循环延迟吗?
用这个逻辑明智吗?
谢谢
asmaith.
嗨asmaitha,
如果您需要一个非常短的延迟,那么是的,我认为使用它是一个好的。
你好Vesan,
谢谢我测试了高达10秒的延迟,它不是如此准确。
我有兴趣知道BLE DA14580是否支持多线程概念?
我的场景是
我有一个while(1)循环正在运行,我正在GPIO上注册一个IRQ(对于按键事件),
因此,如果(1)执行键时,按下键,那么我们应该在循环中突破这一点,而反之亦然(即,再次为Next Keypress,(1)应该开始执行)
但我观察到的是,由于while(1)循环,我的中断没有被执行。
你知道如何实现上述逻辑吗?
谢谢,
asmaith.
你好,阿斯梅塔,
你说的多线程到底是什么意思?无论如何,我想这是一个操作系统的问题。。
GPIO中断甚至应该工作,即使是在一段时间内(1){}循环,如果已正确配置它们。
如果您使用的是使用SDK,我认为在(1)循环中不应该使用(1)循环。最肯定的是循环将破坏它,你会遇到一些奇怪的问题。
按钮按下的是什么?也许我们可以找到比循环更好的解决方案
你好Vesan,
我有一段时间(1)循环,它一直在将特定数据写入SPI到我的从设备。
我在P0_7上有一个键,所以当我按下键时,它会带来低于10msec的拍摄时间,从而产生中断。
我正在注册中断:
gpio_registercallback(gpio0_irqn,keysweep_callback);
GPIO\启用IRQ(GPIO\端口\ 0,GPIO\引脚\ 7,GPIO0\ IRQn,1,1,10);
在我的回电中:
void keysweep_callback(void)
{
if(key_sweep_status == 1)
键\扫描\状态=0;
其他
键\扫描\状态=1;
}
在我的同时(1)
{
if(键\扫描\状态==1)
/ *是否有关行动* /
其他
打破;
}
但是,我遇到的是,一旦控制进入(1)循环,即使我按下键“keysweep_callback”也没有被调用。
谢谢,
asmaith.