你好,
在我们的FW产品应用中,我们需要能够同时使用UART1和UART2以及SPI Flash访问。UART1和UART2将用于与外部设备进行通信,每个设备都连接到另一端的UART线路上。我的问题是:
1.我可以在GPIO引脚上配置和分配所有三个(据我所知,有10个GPIO引脚可用于配置)?如果是这样,怎么样?
2.对于Flash Access的SPI GPIO引脚分配,我需要能够从580处理器读取/写入/擦除闪存。我读到了DOC和关于SPI Flash的论坛,并且关于580是否应该是掌握或奴隶的剧本。我认为它应该是类似于SPI_FLASH示例应用程序的主人。
谢谢,
- khai
设备:
嗨kqtrinh,
1.是的,您可以将引脚配置为您想要的任何GPIO功能,您的意思是有10个GPIOS可用于配置?QFN40和48包分别具有3个港口。请检查数据表。两个UART模块是相同的,可以在不同的GPIOS上分配和配置,同样为单个SPI模块。此外,不同引脚上的外围设备的分配由GPIO_CONFIGUREPIN()和相应的函数pid_uart1_rx / pid_uart2_rx / pid_spi_di等完成。
2.如果SPI模块应该是主人或奴隶取决于您的应用程序,SPI模块可以在两种模式下运行,如果你的SPI设备你想连接闪存那么580应该是一个大师的SPI总线和flash应该是奴隶。
谢谢mt_dialog.
这是我从v3.3数据表中得到的:
数字界面
通用I/ o: 14 (WLCSP34包),
24 (QFN40包装)、32 (QFN48包装)
它是指每580种封装类型的引脚数。然而,当阅读gpio.h中的代码时,我看到了GPIO_PORT的emuns多达4个端口。我们将在你的设计中使用WLCSP34包装。这个包有3或4个端口,我猜?
看看spi_flash的示例代码,它对UART2和SPI使用GPIO端口0。尽管由于我的调试连接处于SPI模式,我无法看到通过UART2打印到控制台的文本输出,但我假定它是工作的。当我在UART模式,文本被打印到Tera Term,但然后读/写SPI Flash成为禁用。
我有FTDI串行到UDB电缆,并遵循一些文档中描述的连接。我似乎无法让SPI和UART同时为这个应用程序工作。
谢谢,
- khai
嗨kqtrinh,
数据表表明可用的GPIO取决于芯片包,因此您应该选择涵盖您需求的包。WLCSP34具有在数据表中指示的引脚,即表示端口0和1,其中数据表中指示的相应引脚。端口2仅适用于QFN40 / 48,端口3为QFN48(DS_V3.3上的第5页,因为笔记表示)。
关于示例代码上的UART和SPI功能,这是因为代码读取和写入SPI,然后将输出打印到UART,因此处理器都无法通过Process SPI和UART使用处理器。580不是多线程系统。
谢谢mt_dialog.
我理解580不是多线程系统。但SPI_FLASH程序不是多线程应用程序。似乎依次执行每个函数(它是SPI Flash访问还是UART OUT到控制台)。没有同时的Flash访问和UART由两个线程写入。
我认为我看不到控制台打印的问题是因为我在SPI模式而不是UART模式。通过SPI模式,我的意思是J4报头根据J4报头最右边的打印引脚图跳转,而UART模式意味着J4根据它旁边的引脚图跳转。这就是为什么我提到了FTDI电缆,建议在一些文档中使用SPI模式,以查看控制台输出。但是我不能让它工作。
如果SPI_FLASH计划做的是一个不可能的事情,为什么它被设计和编码了?此示例应用程序中的功能正是在我们的自定义HW中实现的。我需要从Flash读取数据,然后将其推到UART接口,另一端占用另一个设备。你说这是不可能的吗?
谢谢,
- khai
嗨kqtrinh,
为了操作读写UART的spi flash和打印你需要连接适当的跳投和别针,所以你应该能够按照图在身旁阁下头连接的spi flash,为了要打印的数据你需要将一个跳投P04端口。如果您这样做,您应该看到SPI事务生成的数据(没有外部FTDI,使用板载ATMEL处理器(不需要额外的代码或修改来做到这一点——只需要插入额外的跳线)。
关于上面提到的线程,是为了清楚地表明您无法同时与两个外围设备进行交易。
谢谢mt_dialog.
好的,明白了。
使用DSP外设模式代码库,它使用UART1将文本发送到控制台以供电话显示。
如前所述,我们的应用程序需要580处理器向附加到UART1和UART2的设备发送命令消息。我有peripheral_init_setup.c代码,有以下配置使用UART1, UART2和SPI:
void gpio_reservations(无效)
{
/*
*全球GPIOs预留
* /
保留_GPIO(UART1_TX,GPIO_UART1_TX_PORT,GPIO_UART1_TX_PIN,PID_UART1_TX);
保留_GPIO(UART1_RX,GPIO_UART1_RX_PORT,GPIO_UART1_RX_PIN,PID_UART1_RX);
保留_GPIO(UART2_TX,GPIO_UART2_TX_PORT,GPIO_UART2_TX_PIN,PID_UART2_TX);
保留_GPIO(UART2_RX,GPIO_UART2_RX_PORT,GPIO_UART2_RX_PIN,PID_UART2_RX);
Reserve_gpio (spi_en, spi_gpio_port, spi_cs_pin, pid_spi_en);
保留_GPIO(SPI_CLK,SPI_GPIO_PORT,SPI_CLK_PIN,PID_SPI_CLK);
spe_gpio (spi_do, spi_gpio_port, spi_do_pin, pid_spi_do);
保留_GPIO(SPI_DI,SPI_GPIO_PORT,SPI_DI_PIN,PID_SPI_DI);
#if(uart_hw_flow_enabled)
保留_GPIO(UART1_RTS,GPIO_UART1_RTS_PORT,GPIO_UART1_RTS_PIN,PID_UART1_RTSN);
保留_GPIO(UART1_CTS,GPIO_UART1_CTS_PORT,GPIO_UART1_CTS_PIN,PID_UART1_CTSN);
#endif / * uart_hw_flow_enabled * /
}
#endif // development_debug.
/**
****************************************************************************************
* @brief映射端口引脚
*
*映射UART和SPI端口引脚和GPIO端口
****************************************************************************************
* /
void set_pad_functions(void)//设置GPIO端口功能模式
{
//为qpi1启用uart2
gpio_configurein (GPIO_UART1_TX_PORT, GPIO_UART1_TX_PIN, OUTPUT, PID_UART1_TX, false);
GPIO_ConfigurePin(GPIO_UART1_RX_PORT, GPIO_UART1_RX_PIN, INPUT_PULLUP, PID_UART1_RX, false);
//为QPI2启用UART2
gpio_configurein (GPIO_UART2_TX_PORT, GPIO_UART2_TX_PIN, OUTPUT, PID_UART2_TX, false);
GPIO_ConfigurePin(GPIO_UART2_RX_PORT, GPIO_UART2_RX_PIN, INPUT_PULLUP, PID_UART2_RX, false);
#if(uart_hw_flow_enabled)
GPIO_ConfigurePin(GPIO_UART1_RTS_PORT, GPIO_UART1_RTS_PIN, OUTPUT, PID_UART1_RTSN, false);
gpio_configurepin(gpio_uart1_cts_port,gpio_uart1_cts_pin,input_pullup,pid_uart1_ctsn,false);
gpio_configurepin(gpio_uart2_rts_port,gpio_uart2_rts_pin,输出,pid_uart2_rtsn,false);
gpio_configurepin(gpio_uart2_cts_port,gpio_uart2_cts_pin,input_pullup,pid_uart2_ctsn,false);
#endif // uart_hw_flow_enabled.
//配置SPI Flash
gpio_configurepin(spi_gpio_port,spi_cs_pin,输出,pid_spi_en,true);
gpio_configurepin(spi_gpio_port,spi_clk_pin,输出,pid_spi_clk,false);
gpio_configurepin(spi_gpio_port,spi_do_pin,输出,pid_spi_do,false);
gpio_configurepin(spi_gpio_port,spi_di_pin,输入,pid_spi_di,false);
}
如果我想与附加到UART1或UART2的设备通信,我如何切换到正确的UART通道?
谢谢,
- khai
嗨kqtrinh,
请不要在不相关的主题上发布额外的问题,对于一个新的问题,你总是可以创建一个新的线程。
关于您的问题,UART和UART2模块使用不同的驱动程序为每个UART模块设置不同的寄存器,例如,在DSPS中,应用程序使用的UART使用uart_sps_init()初始化UART。此外,DSPS使用UART2来打印一些调试消息,因此,如果您有CFG_PRINTF_UART2,那么UART2模块将由uart2_init()函数初始化。因此,对于每个uart模块,都有相应的驱动程序控制相应的uart寄存器。
谢谢mt_dialog.