你好,我使用的是DA14580,现在我想用UART接口将我的DA14580与另一个单片机连接,可以使用哪些端口引脚?我的DA14580也使用了I2C-EEPROM。
谢谢,asmaitha
你好,我没有使用DA1458x与外部处理器配置,但在/keil_projects/proximity/reporter_fe/中有示例
我认为由于GPIO多路复用,您可以非常自由地选择UART的引脚配置。查看文件peripher_setup .c(在项目视图arch文件夹中),在那里你有GPIO_ConfigurePin函数。以上引脚配置,您还必须保留IO(开发时)。这是通过RESERVE_GPIO宏完成的。
最好的问候,视频电子设备标准协会
你好,视频电子设备标准协会,谢谢你提供的信息。我怀疑的是,任何端口上的任何引脚都可以用作UART引脚吗?我对SPI也有同样的怀疑?P1_0, P1_1, P1_2引脚是否可以使用串行CLK,串行数据,串行芯片选择引脚?
是否有文档描述每个引脚可以支持哪些不同的功能?
谢谢asm
根据数据表,您可以在任何端口上使用UART (http://support.dialog-semiconductor.com/resource/da14580-datasheet第7页)
属下做输出。UART传输数据。映射到Px端口URX DI输入。UART接收数据。映射到Px端口分析输出。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 < chunk_size){SetWord16 (SPI_RX_TX_REG0 * write_buf + +);//写入设备,自增后{做} while(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 < chunk_size){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_BITc++;/ /增加c}
类似的东西,我还没有测试过!!
PS.如果你想同时读取,你需要这样做read_buf = GetWord16(SPI_RX_TX_REG0) & 0xff;用0xff屏蔽只是为了确保没有不需要的数据到达。这个方法有点棘手,你需要使用缓冲区…我从未遇到过SPI块大小为24位的设备
我没有在短时间内想出其他主意
你好,视频电子设备标准协会,非常感谢。幸运的是,我使用的芯片不允许读操作,即没有MISO信号。所以我只需要执行SPI_Write操作。
你好,
我有一个奴隶包含3个不同的控制寄存器,根据我的SPI从设备数据表,在每次spi_write操作后,我需要等待10msec,然后再做一个spi_write:spi_write (register1、数据);延迟(10毫秒);spi_write (register2、数据);延迟(10毫秒);
我如何引入这个10毫秒的延迟?
你好asmaitha,
您可以使用内核计时器。
APP_MSG
APP_EVENT_TIMER
Int timer_handler(ke_msg_id_t const msgid, 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\refip\src\driver\timer中,有一个timer.h文件可以直接使用这些函数来生成微秒延迟。
是的,看来你可以用timer_wait功能等待最大1000µs,或1ms。
timer_wait
您需要在头文件中定义处理程序函数,然后将其包含在spi驱动程序中。
你好,视频电子设备标准协会,谢谢你提供的信息。
在peripheral_examples中的一个SDK示例中:我发现(我= 00;< 20;我+ +);这个循环引入了7.6微秒的延迟我们可以用这个for循环来计算延迟吗?
使用这种逻辑明智吗?
谢谢asmaitha
嗨asmaitha,
如果你需要非常短的延迟,那么是的,我认为使用这个是可以的。
你好VesaN,谢谢,我测试了长达10秒的延迟,不是很准确。我想知道BLE DA14580是否支持多线程概念?我的设想是我有一个while(1)循环运行,我正在GPIO上注册一个IRQ(用于按键事件),所以当键被按下时,如果while(1)正在执行,那么我们应该跳出while循环,反之亦然。当(1)应该开始执行时,再次按下下一个键)
但是我观察到的是,由于while(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){如果(Key_sweep_status = = 1)/*做相关的动作*/其他的打破;}
但是我遇到的是,一旦控制进入while(1)循环,即使我按下“keysweep_callback”键也不会被调用。
你好,
我没有使用DA1458x与外部处理器配置,但在/keil_projects/proximity/reporter_fe/中有示例
我认为由于GPIO多路复用,您可以非常自由地选择UART的引脚配置。查看文件peripher_setup .c(在项目视图arch文件夹中),在那里你有GPIO_ConfigurePin函数。以上引脚配置,您还必须保留IO(开发时)。这是通过RESERVE_GPIO宏完成的。
最好的问候,视频电子设备标准协会
你好,视频电子设备标准协会,
谢谢你提供的信息。
我怀疑的是,任何端口上的任何引脚都可以用作UART引脚吗?我对SPI也有同样的怀疑?
P1_0, P1_1, P1_2引脚是否可以使用串行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 < chunk_size)
{
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位的设备
我没有在短时间内想出其他主意
你好,视频电子设备标准协会,
非常感谢。
幸运的是,我使用的芯片不允许读操作,即没有MISO信号。
所以我只需要执行SPI_Write操作。
谢谢
asm
你好,
我有一个奴隶包含3个不同的控制寄存器,
根据我的SPI从设备数据表,在每次spi_write操作后,我需要等待10msec,然后再做一个spi_write:
spi_write (register1、数据);
延迟(10毫秒);
spi_write (register2、数据);
延迟(10毫秒);
我如何引入这个10毫秒的延迟?
谢谢,
asmaitha
你好asmaitha,
您可以使用内核计时器。
APP_MSG输入文件app_api.h描述你的时间,例如:APP_EVENT_TIMER.Int timer_handler(ke_msg_id_t const msgid, 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\refip\src\driver\timer中,有一个timer.h文件可以直接使用这些函数来生成微秒延迟。
谢谢,
asmaitha
你好asmaitha,
是的,看来你可以用
timer_wait功能等待最大1000µs,或1ms。您需要在头文件中定义处理程序函数,然后将其包含在spi驱动程序中。
你好,视频电子设备标准协会,
谢谢你提供的信息。
在peripheral_examples中的一个SDK示例中:
我发现
(我= 00;< 20;我+ +);这个循环引入了7.6微秒的延迟
我们可以用这个for循环来计算延迟吗?
使用这种逻辑明智吗?
谢谢
asmaitha
嗨asmaitha,
如果你需要非常短的延迟,那么是的,我认为使用这个是可以的。
你好VesaN,
谢谢,我测试了长达10秒的延迟,不是很准确。
我想知道BLE DA14580是否支持多线程概念?
我的设想是
我有一个while(1)循环运行,我正在GPIO上注册一个IRQ(用于按键事件),
所以当键被按下时,如果while(1)正在执行,那么我们应该跳出while循环,反之亦然。当(1)应该开始执行时,再次按下下一个键)
但是我观察到的是,由于while(1)循环,我的中断没有被执行。
知道如何实现上面的逻辑吗?
谢谢,
asmaitha
你好asmaitha,
多线程到底是什么意思?无论如何,我认为这是一个操作系统的问题。
如果配置正确,即使在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)
{
如果(Key_sweep_status = = 1)
/*做相关的动作*/
其他的
打破;
}
但是我遇到的是,一旦控制进入while(1)循环,即使我按下“keysweep_callback”键也不会被调用。
谢谢,
asmaitha