你好,
在我们的FW产品应用程序中,我们需要能够同时使用UART1和UART2以及SPI Flash访问。UART1和UART2将用于与外部设备通信,每个设备都与另一端的UART线相连。我的问题是:
1.我可以在GPIO引脚上配置并分配所有三个引脚吗(据我所知,有10个GPIO引脚可供配置)?如果是这样,如何?
2.对于Flash访问的SPI gpio引脚分配,我需要能够从580处理器读/写/擦除Flash。我读了关于SPI Flash的文档和论坛,我仍然困惑580应该是Master还是Slave。我认为它应该是Master,类似于spi_flash示例应用程序。
谢谢,
——潘文凯
设备:
嗨kqtrinh,
1.是的,你可以配置你的引脚到任何gpio功能,你说有10个gpio可用于配置是什么意思?qfn40和48包分别有3个和4个端口。请检查数据表。两个UART模块是相同的,它们可以被分配和配置在不同的gpio上,对于单个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的示例代码,它将GPIO端口0用于UART2和SPI。虽然我不能看到通过UART2打印到控制台的文本输出,因为我的调试连接处于SPI模式,但我认为它工作。当我在UART模式,文本被打印到Tera Term,但然后读/写SPI Flash成为禁用。
我有FTDI串口到UDB电缆,并遵循一些文件中描述的连接。我似乎不能让SPI和UART同时为这个应用程序工作。
谢谢,
——潘文凯
嗨kqtrinh,
数据表表明可用的GPIO取决于芯片封装,因此您应该选择一个满足您的需求的封装。WLCSP34具有数据表中所指示的引脚,即端口0和端口1,以及数据表中所指示的相应引脚。端口2仅用于QFN40/48,端口3用于QFN48(如注释所示,DS_V3.3上的第5页)。
关于示例代码上的UART和SPI功能,这是因为代码读取和写入SPI,然后将输出打印到UART,处理器无法同时被进程SPI和UART使用。580不是一个多线程系统。
由于MT_dialog
我知道580不是一个多线程系统。但是spi_flash程序不是一个多线程应用程序。它似乎是依次执行每个函数(无论是SPI flash访问还是UART输出到控制台)。两个线程不能同时进行flash访问和UART写入。
我认为我没有看到控制台打印的问题是因为我在SPI模式,而不是UART模式。通过SPI模式,我的意思是J4头跳根据打印的引脚图在最右边的J4头而UART模式意味着J4跳根据它旁边的引脚图。这就是为什么我提到FTDI电缆,建议在某些文档中使用SPI模式来查看控制台输出。但是我不能让它工作。
如果spi_flash程序所做的事情是不可能的,为什么要这样设计和编码呢?这个示例应用程序中的功能正是我需要在我们的自定义HW中实现的。我需要从Flash中读取数据,并将其推到UART接口到另一端的另一个设备来消费。你是说这是不可能的?
谢谢,
——潘文凯
嗨kqtrinh,
为了操作读写UART的spi flash和打印你需要连接适当的跳投和别针,所以你应该能够按照图在身旁阁下头连接的spi flash,为了要打印的数据你需要将一个跳投P04端口。如果您这样做了,您应该会看到SPI事务生成的数据(不需要外部FTDI,通过使用板载ATMEL处理器)(这样做不需要额外的代码或修改——只需插入额外的跳线)。
关于我上面提到的线程,是为了说明你不能同时对两个外围设备进行事务处理。
由于MT_dialog
好的,明白了。
使用dsp外设模式代码库,它使用UART1将文本发送到控制台以从电话显示。
如前所述,我们的应用程序需要580处理器向连接到UART1和UART2的设备发送命令消息。我有peripheral_init_setup.c代码,有以下配置使用UART1, UART2和SPI:
空白GPIO_reservations(空白)
{
/*
*全球预留gpio预留
*/
Reserve_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);
Reserve_gpio (uart2_tx, gpio_uart2_tx_port, gpio_uart2_tx_pin, pid_uart2_tx);
Reserve_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);
Reserve_gpio (spi_clk, spi_gpio_port, spi_clk_pin, pid_spi_clk);
Reserve_gpio (spi_do, spi_gpio_port, spi_do_pin, pid_spi_do);
Reserve_gpio (spi_di, spi_gpio_port, spi_di_pin, pid_spi_di);
#如果(UART_HW_FLOW_ENABLED)
预留gpio (uart1_rts_port, gpio_uart1_rts_pin, pid_uart1_rtsn);
Reserve_gpio (uart1_ctsn, gpio_uart1_cts_port, gpio_uart1_cts_pin, pid_uart1_ctsn);
# endif / * UART_HW_FLOW_ENABLED * /
}
# endif / / DEVELOPMENT_DEBUG
/**
****************************************************************************************
* @brief Map端口引脚
*
* Uart和SPI端口引脚和GPIO端口映射
****************************************************************************************
*/
Void set_pad_functions(Void) //设置gpio端口功能模式
{
//启用UART2 for QPI1
GPIO_ConfigurePin(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);
//启用UART2 for QPI2
GPIO_ConfigurePin(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);
#如果(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, OUTPUT, 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, OUTPUT, PID_SPI_EN, true);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_DO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_DI_PIN, INPUT, PID_SPI_DI, false);
}
如果我想与连接到UART1或UART2的设备通信,我如何切换到正确的UART通道?
谢谢,
——潘文凯
嗨kqtrinh,
请不要在一个不相关的话题上发布额外的问题,对于一个新的问题,你总是可以创建一个新的线程。
关于你的问题,UART和UART2模块使用不同的驱动程序,为每个UART模块设置不同的寄存器,例如在DSPS中,从应用程序使用的UART使用uart_sps_init(),它初始化UART。DSPS还使用UART2来打印一些调试消息,因此如果您有CFG_PRINTF_UART2, UART2模块将由uart2_init()函数初始化。因此,对于每个uart模块都有相应的驱动程序,它们控制相应的uart寄存器。
由于MT_dialog