你好,我用的是DA14580,现在我想把我的DA14580和UART接口上的另一个微控制器连接起来,可以使用哪些端口引脚?我的DA14580也使用I2C-EEPROM。
谢谢,阿斯梅塔
你好,我没有将DA1458x与外部处理器配置一起使用,但在/keil\u projects/proximity/reporter\u fe中有一个示例/
我认为,由于GPIO多路复用,您可以非常自由地选择UART的引脚配置。请参阅文件periph\u setup.c(在µVision的项目视图中的arch文件夹中),其中包含GPIO\u ConfigurePin函数。在上述引脚配置中,还必须保留IO(在开发时)。这是用RESERVE\u GPIO宏完成的。
敬你,维萨
你好,维萨,谢谢你的消息。我的疑问是,任何端口上的任何管脚都可以用作UART管脚吗?我对SPI也有同样的怀疑?P1\ U 0、P1\ U 1、P1\ U 2引脚是否可以使用串行时钟、串行数据、串行芯片选择引脚?
是否有文件描述每个pin可以支持哪些不同的功能?
谢谢asm公司
根据数据表,您可以在任何端口上使用UART(http://support.dialog-semiconductor.com/resource/da14580-datasheet,第7页)
UTX DO输出。UART传输数据。映射到Px端口URX DI输入。UART接收数据。映射到Px端口城市轨道交通不输出。要发送的UART请求。映射到Px端口UCTS DI输入。UART清除发送。映射到Px端口UTX2 DO输出。UART 2传输数据。映射到Px端口URX2 DI输入。UART 2接收数据。映射到Px端口URTS2 DO输出。要发送的UART 2请求。映射到Px端口UCTS2 DI输入。UART 2清除发送。映射到Px端口
同样适用于SPI总线
SPI\ U CLK DO输入/输出。SPI时钟。映射到Px端口SPI输入。SPI数据输入。映射到Px端口SPI\u DO输出。SPI数据输出。映射到Px端口SPI\u EN DI输入。SPI时钟启用。映射到Px端口
有关其他管脚映射,请参见数据表。注意,模拟接口使用固定映射。
谢谢!
你好,维萨,谢谢。现在我了解到,只要我们在periph\u setup.h文件中适当地初始化这些管脚,任何Px管脚都可以配置为SPI接口管脚。但根据DA14580数据表,SPI仅支持8/16/32位模式传输,但我的从机在内存中有一个24位的寄存器数据大小。如何在这种情况下传输数据。
谢谢苏贾尼亚,K
嗨,苏贾尼亚,好的,
我想你可以用8位模式:SetBits16(SPI_CTRL_REG,SPI_WORD,SPI_MODE_8BIT);//设置为8BIT MODE
SetBits16(SPI_CTRL_REG,SPI_WORD,SPI_MODE_8BIT);//设置为8BIT MODE
并以三个8位块的块进行读/写操作:uint8\u t write\u buf[]={0x01、0x02、0x03};常量int chunk\u 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};常量int chunk\u 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_位c++;//增量c}
像这样的,我还没试过!!
另外,如果您想同时读取,您需要执行如下操作:read\u buf=GetWord16(SPI\u RX\u TX\u REG0)&0xff;用0xff屏蔽,以确保没有不需要的数据到达。这个方法有点棘手,你需要使用缓冲区。。。我从未遇到过SPI块大小为24位的设备
我没有在短时间内想出其他主意
你好,维萨,谢谢。幸运的是,我使用的芯片,它不允许读取操作,即没有MISO信号。所以我只需要执行SPI\u写操作。
你好,
我有一个包含3个不同控制寄存器的从机,根据我的SPI从设备数据表,在每次SPI\ U写入操作之后,我需要等待10秒,然后再进行一次SPI\ U写入:spi\ U写(寄存器1,数据);延时(10毫秒);spi\ U写(寄存器2,数据);延时(10毫秒);
我怎样才能引入10毫秒的延迟呢?
你好,阿斯梅塔,
你可以使用内核定时器。
应用程序消息
应用程序事件计时器
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}
定时器设置
清除计时器
注意:这是内核计时器,它总是有点不准确,但我想它应该可以工作。至少,你可以先试试。
你好,维萨,非常感谢你的帮助。
我真的很抱歉,但我知道如何定义和调用定时器处理程序在我的spi驱动程序文件。请你指导我一些实施的例子。
在位置-->DSPS\u 0\DA14580\u DSPS\u 3.150.2\dk\u apps\src\plf\refip\src\driver\timer的DSPS\u 0示例中,有一个timer.h文件,我们可以直接使用这些函数来生成微秒延迟。
是的,看来你可以用计时器\u等待函数以等待最大1000µs或1ms。
计时器\u等待
您需要在头文件中定义handler函数,然后将其包含在spi驱动程序中。
你好,维萨,谢谢你的信息。
在以下示例中的一个SDK示例中:我发现了对于(I=00;I<20;I++);此循环引入7.6miccro秒的延迟所以我们可以用这个来循环延迟吗?
用这个逻辑明智吗?
谢谢阿斯梅塔
嗨,阿斯梅塔,
如果你需要一个很短的延迟,那么是的,我认为使用它是可以的。
你好,维桑,谢谢,我测试了10秒的延迟,它不是那么准确。我想知道BLE DA14580是否支持多线程的概念?我的设想是我有一个while(1)循环正在运行,我正在GPIO上注册一个IRQ(对于按键事件),因此,每当按下键时,如果while(1)正在执行,那么我们应该从while循环中断,反之亦然(即,对于下一次再次按下键,while(1)应该开始执行)
但我观察到的是,由于while(1)循环,我的中断没有被执行。
你知道如何实现上述逻辑吗?
你说的多线程到底是什么意思?无论如何,我想这是一个操作系统的问题。。
即使在while(1){}循环中,如果配置正确,GPIO中断也应该可以工作。
我认为如果您使用的是SDK,就不应该使用while(1)这样的循环。最肯定的是,循环将打破它,你会遇到一些奇怪的问题。
你想用按键来达到什么目的?也许我们能找到比while循环更好的解决方案
你好,维桑,我有一个while(1)循环,它不断地通过SPI向我的从属设备写入特定的数据。我在P0\u7上有一个键,所以当我按下这个键时,它会以10毫秒的去抖动周期变低,从而产生一个中断。我将中断注册为:GPIO\u RegisterCallback(GPIO0\u IRQn,keysweep\u回调);GPIO\启用IRQ(GPIO\端口\ 0,GPIO\引脚\ 7,GPIO0\ IRQn,1,1,10);
在我的回电中:
void keysweep\u回调(void){
if(键\扫描\状态==1)键\扫描\状态=0;其他的键\扫描\状态=1;}
我的内心(1){if(键\扫描\状态==1)/*执行相关操作*/其他的中断;}
但我遇到的是,一旦控制进入while(1)循环,即使我按下“keysweep\u callback”键也不会被调用。
你好,
我没有将DA1458x与外部处理器配置一起使用,但在/keil\u projects/proximity/reporter\u fe中有一个示例/
我认为,由于GPIO多路复用,您可以非常自由地选择UART的引脚配置。请参阅文件periph\u setup.c(在µVision的项目视图中的arch文件夹中),其中包含GPIO\u ConfigurePin函数。在上述引脚配置中,还必须保留IO(在开发时)。这是用RESERVE\u GPIO宏完成的。
敬你,维萨
你好,维萨,
谢谢你的消息。
我的疑问是,任何端口上的任何管脚都可以用作UART管脚吗?我对SPI也有同样的怀疑?
P1\ U 0、P1\ U 1、P1\ U 2引脚是否可以使用串行时钟、串行数据、串行芯片选择引脚?
是否有文件描述每个pin可以支持哪些不同的功能?
谢谢
asm公司
根据数据表,您可以在任何端口上使用UART(http://support.dialog-semiconductor.com/resource/da14580-datasheet,第7页)
同样适用于SPI总线
有关其他管脚映射,请参见数据表。注意,模拟接口使用固定映射。
谢谢!
你好,维萨,
谢谢。
现在我了解到,只要我们在periph\u setup.h文件中适当地初始化这些管脚,任何Px管脚都可以配置为SPI接口管脚。
但根据DA14580数据表,SPI仅支持8/16/32位模式传输,但我的从机在内存中有一个24位的寄存器数据大小。如何在这种情况下传输数据。
谢谢
苏贾尼亚,K
嗨,苏贾尼亚,好的,
我想你可以用8位模式:
SetBits16(SPI_CTRL_REG,SPI_WORD,SPI_MODE_8BIT);//设置为8BIT MODE
并以三个8位块的块进行读/写操作:
uint8\u t write\u buf[]={0x01、0x02、0x03};
常量int chunk\u 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_位
c++;//增量c
}
像这样的,我还没试过!!
另外,如果您想同时读取,您需要执行如下操作:read\u buf=GetWord16(SPI\u RX\u TX\u REG0)&0xff;用0xff屏蔽,以确保没有不需要的数据到达。这个方法有点棘手,你需要使用缓冲区。。。我从未遇到过SPI块大小为24位的设备
我没有在短时间内想出其他主意
你好,维萨,
谢谢。
幸运的是,我使用的芯片,它不允许读取操作,即没有MISO信号。
所以我只需要执行SPI\u写操作。
谢谢
asm公司
你好,
我有一个包含3个不同控制寄存器的从机,
根据我的SPI从设备数据表,在每次SPI\ U写入操作之后,我需要等待10秒,然后再进行一次SPI\ U写入:
spi\ U写(寄存器1,数据);
延时(10毫秒);
spi\ U写(寄存器2,数据);
延时(10毫秒);
我怎样才能引入10毫秒的延迟呢?
谢谢,
阿斯梅塔
你好,阿斯梅塔,
你可以使用内核定时器。
应用程序消息
键入文件应用程序api.h描述你的时间,例如。,应用程序事件计时器
.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)
. 将函数定义也添加到头文件中!此函数必须对文件可见应用程序任务处理程序.h{APP\u EVENT\u TIMER,(ke\u msg\u func\t)APP\u EVENT\u TIMER\u handler}
. 如果需要,添加特定的配置文件包含条件。定时器设置
设置计时器。清除计时器
.注意:这是内核计时器,它总是有点不准确,但我想它应该可以工作。至少,你可以先试试。
你好,维萨,
非常感谢你的帮助。
我真的很抱歉,但我知道如何定义和调用定时器处理程序在我的spi驱动程序文件。
请你指导我一些实施的例子。
在位置-->DSPS\u 0\DA14580\u DSPS\u 3.150.2\dk\u apps\src\plf\refip\src\driver\timer的DSPS\u 0示例中,有一个timer.h文件,我们可以直接使用这些函数来生成微秒延迟。
谢谢,
阿斯梅塔
你好,阿斯梅塔,
是的,看来你可以用
计时器\u等待
函数以等待最大1000µs或1ms。您需要在头文件中定义handler函数,然后将其包含在spi驱动程序中。
你好,维萨,
谢谢你的信息。
在以下示例中的一个SDK示例中:
我发现了
对于(I=00;I<20;I++);此循环引入7.6miccro秒的延迟
所以我们可以用这个来循环延迟吗?
用这个逻辑明智吗?
谢谢
阿斯梅塔
嗨,阿斯梅塔,
如果你需要一个很短的延迟,那么是的,我认为使用它是可以的。
你好,维桑,
谢谢,我测试了10秒的延迟,它不是那么准确。
我想知道BLE DA14580是否支持多线程的概念?
我的设想是
我有一个while(1)循环正在运行,我正在GPIO上注册一个IRQ(对于按键事件),
因此,每当按下键时,如果while(1)正在执行,那么我们应该从while循环中断,反之亦然(即,对于下一次再次按下键,while(1)应该开始执行)
但我观察到的是,由于while(1)循环,我的中断没有被执行。
你知道如何实现上述逻辑吗?
谢谢,
阿斯梅塔
你好,阿斯梅塔,
你说的多线程到底是什么意思?无论如何,我想这是一个操作系统的问题。。
即使在while(1){}循环中,如果配置正确,GPIO中断也应该可以工作。
我认为如果您使用的是SDK,就不应该使用while(1)这样的循环。最肯定的是,循环将打破它,你会遇到一些奇怪的问题。
你想用按键来达到什么目的?也许我们能找到比while循环更好的解决方案
你好,维桑,
我有一个while(1)循环,它不断地通过SPI向我的从属设备写入特定的数据。
我在P0\u7上有一个键,所以当我按下这个键时,它会以10毫秒的去抖动周期变低,从而产生一个中断。
我将中断注册为:
GPIO\u RegisterCallback(GPIO0\u IRQn,keysweep\u回调);
GPIO\启用IRQ(GPIO\端口\ 0,GPIO\引脚\ 7,GPIO0\ IRQn,1,1,10);
在我的回电中:
void keysweep\u回调(void)
{
if(键\扫描\状态==1)
键\扫描\状态=0;
其他的
键\扫描\状态=1;
}
我的内心(1)
{
if(键\扫描\状态==1)
/*执行相关操作*/
其他的
中断;
}
但我遇到的是,一旦控制进入while(1)循环,即使我按下“keysweep\u callback”键也不会被调用。
谢谢,
阿斯梅塔