This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
在一个运行在 TM4C123GH6PM 和 TM4C123GHPGE 上的成熟代码库中、使用全部4个 SSI。
我们正在添加对 TM4C1290NCPDT 的支持。 UART0、I2C0正常工作、但用于 MicroSD 卡/FatFS 的 SSI0不工作。
查看 Tiva 迁移文档: https://www.ti.com/lit/an/spma065/spma065.pdf、除了 PA4/PA5 TX/RX 角色外、在123G 和1290N 之间切换 SSI0方面没有什么特别突出的。
单步执行调用堆栈:
- fresult = f_opendir (&g_sDirObject、g_cCwdBuf); 调用 disk_initialize (spi)(在 microcat.c 中)
- res = find_volume (&FS、&path、0); 最终返回 FR_NOT_READY。 find_volume 调用 disk_initialize
- stat = disk_initialize(fs->drv);/*初始化物理驱动器*/ disk_initialize 调用 power_on 设置 SSI。 请参见下文。
旧 SPI 映射:
123g MISO=RX=PA4=SSI0_MISO MOSI= 381=PA5=SSI0_MOSI CLK= 4.2=SSI0_CLK CS=PA3
1290: MISO=RX=PA5=SSI0_DAT1 MOSI= 3024=PA4=SSI0_DAT0 CLK= 3.42=SSI0_CLK CS= 3.453.
我想知道是否缺少有关 SSI0将代码从 TM4c123g 迁移到 TM4C1290n 的内容?
谢谢
在 diskio.c 中、平台绑定和 SSI 设置:
#ifdef PART_TM4C1290NCPDT
/* Peripheral definitions for TM4c1290N base serlog_msc3 board */
// SSI port
#define SDC_SSI_BASE SSI0_BASE
#define SDC_SSI_SYSCTL_PERIPH SYSCTL_PERIPH_SSI0
// GPIO for SSI pins
#define SDC_GPIO_PORT_BASE GPIO_PORTA_BASE
#define SDC_GPIO_SYSCTL_PERIPH SYSCTL_PERIPH_GPIOA
#define SDC_SSI_CLK GPIO_PIN_2
#define SDC_SSI_TX GPIO_PIN_4 //NOTE: RX/TX swapped vs TM4c123g per www.ti.com/.../spma065.pdf
#define SDC_SSI_RX GPIO_PIN_5
#define SDC_SSI_FSS GPIO_PIN_3
#define SDC_SSI_PINS (SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK | SDC_SSI_FSS)
#else
/* Peripheral definitions for TM4C123G board */
// SSI port
#define SDC_SSI_BASE SSI0_BASE
#define SDC_SSI_SYSCTL_PERIPH SYSCTL_PERIPH_SSI0
// GPIO for SSI pins
#define SDC_GPIO_PORT_BASE GPIO_PORTA_BASE
#define SDC_GPIO_SYSCTL_PERIPH SYSCTL_PERIPH_GPIOA
#define SDC_SSI_CLK GPIO_PIN_2
#define SDC_SSI_TX GPIO_PIN_5
#define SDC_SSI_RX GPIO_PIN_4
#define SDC_SSI_FSS GPIO_PIN_3
#define SDC_SSI_PINS (SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK | SDC_SSI_FSS)
#endif
static
void power_on (void)
{
/*
* This doesn't really turn the power on unless the hardware supports it, but initializes the
* SSI port and pins needed to talk to the card.
*/
/* Enable the peripherals used to drive the SDC on SSI */
ROM_SysCtlPeripheralEnable(SDC_SSI_SYSCTL_PERIPH);
ROM_SysCtlPeripheralEnable(SDC_GPIO_SYSCTL_PERIPH);
/*
* Configure the appropriate pins to be SSI instead of GPIO. The FSS (CS)
* signal is directly driven to ensure that we can hold it low through a
* complete transaction with the SD card.
*/
ROM_GPIOPinTypeSSI(SDC_GPIO_PORT_BASE, SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK);
ROM_GPIOPinTypeGPIOOutput(SDC_GPIO_PORT_BASE, SDC_SSI_FSS);
/*
* Set the SSI output pins to 4MA drive strength and engage the
* pull-up on the receive line.
*/
ROM_GPIOPadConfigSet(SDC_GPIO_PORT_BASE, SDC_SSI_RX, GPIO_STRENGTH_4MA,
GPIO_PIN_TYPE_STD_WPU);
ROM_GPIOPadConfigSet(SDC_GPIO_PORT_BASE, SDC_SSI_CLK | SDC_SSI_TX | SDC_SSI_FSS,
GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
/* Configure the SSI0 port */
// ROM_SSIConfigSetExpClk(SDC_SSI_BASE, ROM_SysCtlClockGet(),
// SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 400000, 8);
ROM_SSIConfigSetExpClk(SDC_SSI_BASE, g_ui32SysClock, //ROM_SysCtlClockGet() is not available on TM4C1290
SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 400000, 8);
ROM_SSIEnable(SDC_SSI_BASE);
/* Set DI and CS high and apply more than 74 pulses to SCLK for the card */
/* to be able to accept a native command. */
send_initial_clock_train();
/*-----------------------------------------------------------------------*/
/* Send 80 or so clock transitions with CS and DI held high. This is */
/* required after card power up to get it into SPI mode */
/*-----------------------------------------------------------------------*/
static
void send_initial_clock_train(void)
{
unsigned int i;
uint32_t ui32Dat;
/* Ensure CS is held high. */
DESELECT();
/* Switch the SSI TX line to a GPIO and drive it high too. */
ROM_GPIOPinTypeGPIOOutput(SDC_GPIO_PORT_BASE, SDC_SSI_TX);
ROM_GPIOPinWrite(SDC_GPIO_PORT_BASE, SDC_SSI_TX, SDC_SSI_TX);
/* Send 10 bytes over the SSI. This causes the clock to wiggle the */
/* required number of times. */
for(i = 0 ; i < 10 ; i++)
{
/* Write DUMMY data. SSIDataPut() waits until there is room in the */
/* FIFO. */
ROM_SSIDataPut(SDC_SSI_BASE, 0xFF);
/* Flush data read during data write. */
ROM_SSIDataGet(SDC_SSI_BASE, &ui32Dat);
}
/* Revert to hardware control of the SSI TX line. */
ROM_GPIOPinTypeSSI(SDC_GPIO_PORT_BASE, SDC_SSI_TX);
}
您好!
从较高层次看、我不看到您配置了引脚多路复用。 我应该会看到 用于为 SSI 配置引脚的 GPIOPinConfigure()。 请参阅以下示例代码、我在您的代码中不会看到这些示例代码、除非它们是编写代码中未在此处显示的其他位置。
MAP_GPIOPinConfigure (GPIO_PA2_SSI0CLK);
MAP_GPIOPinConfigure (GPIO_PA3_SSI0FSS);
MAP_GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
MAP_GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);
我强烈建议您在 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\ssi_master_slave_xfer 中运行示例。 该示例使用 SSI0作为主设备、SSI1作为从设备。 运行该示例、它应该可以开箱即用。 通过这种方法、可以比较示例和代码之间 GPIO 和 SSI0模块中的寄存器设置。 稍后、您可以自定义驱动强度设置、我看到您使用的是4mA、而不是 TivaWare 库的默认值2mA。
如果您有示波器或逻辑分析仪、它将是一个方便的工具、可以帮助您了解信号是否在 SSI0引脚上正摆动。
感谢您的答复。 我已经使用 SysConfig 工具生成 pinmux (忘记将其添加到 POST 中)并将这些设置填充到 init_sdcard (microxx.c)中
我使用的是 CCS v12、我有一个定制的1290板。 我刚刚订购了1294 Launchpad、我将尝试您建议的示例。 这是针对1290和123g 的代码。 我没有放置测试点以便轻松访问 SPI、但它在我的列表中是为了附加我的 saleae 逻辑并查看信号。
#ifdef PART_TM4C1290NCPDT
ROM_SysCtlPeripheralEnable (SYSCTL_PERIPH_SSI0);//(已在 init_TM4C1290NCPDT_128pin.c 中完成
ROM_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA);//
//配置引脚复用(PA4/PA5与 TM4c123g 交换、令人困惑!)
ROM_GPIOPinConfigure (GPIO_PA2_SSI0CLK);//为 PA2配置 SSI0CLK 的 GPIO 引脚多路复用器
ROM_GPIOPinConfigure (GPIO_PA3_SSI0FSS);//为 PA3配置 SSI0FSS 的 GPIO 引脚多路复用器
ROM_GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);//为 PA5配置 GPIO 引脚多路复用器、对于 SSI0XDAT1 - MISO、之前为 GPIO_PA4_SSI0RX
ROM_GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);//为 SSI0XDAT0 - MOSI 配置 PA4的 GPIO 引脚多路复用器、之前为 GPIO_PA5_SSI0TX
//配置 SSI 引脚的 GPIO 设置。 (已在 INIT_中完成)
ROM_GPIOPinTypeSSI (GPIO_PORTA_BASE、GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
//配置并启用 SPI 主模式的 SSI 端口。
//MOTO_MODE_0是 SD 卡的最佳选择。
ROM_SSIConfigSetExpClk (SSI0_BASE、g_ui32SysClock、SSI_FRF_MOTO_MODE_0、
SSI_MODE_MASTER、1000000、8);
ROM_SSIEnable (SSI0_BASE);
//在开始与 uSD 卡通信之前清空接收 FIFO。
while (ROM_SSIDataGetNonBlocking (SSI0_BASE、&ulDatarx[0])
{
;
}
#endif
#ifdef PART_TM4C123GH6PM
ROM_SysCtlPeripheralEnable (SYSCTL_PERIPH_SSI0);
ROM_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA);
//配置引脚复用
ROM_GPIOPinConfigure (GPIO_PA2_SSI0CLK);
ROM_GPIOPinConfigure (GPIO_PA3_SSI0FSS);
ROM_GPIOPinConfigure (GPIO_PA4_SSI0RX);
ROM_GPIOPinConfigure (GPIO_PA5_SSI0TX);
//配置 SSI 引脚的 GPIO 设置。
ROM_GPIOPinTypeSSI (GPIO_PORTA_BASE、GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
//配置并启用 SPI 主模式的 SSI 端口。
//MOTO_MODE_0是 SD 卡的最佳选择。
ROM_SSIConfigSetExpClk (SSI0_BASE、ROM_SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、
SSI_MODE_MASTER、1000000、8);
ROM_SSIEnable (SSI0_BASE);
//在开始与 SDCard 通信之前清空接收 FIFO。
while (ROM_SSIDataGetNonBlocking (SSI0_BASE、&ulDatarx[0])
{
;
}
#endif
尊敬的 Pentleman:
TM4C1290NCPDT 和 TM4C1294NCPDT 之间的 SSI0引脚多路复用是相同的。 您应该能够在定制电路板上运行此示例。
另一个更简单的 SSI0示例可以在 C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripherals\ssi\spi_master.c 中找到 此示例在 TM4C123和 TM4C129上都是通用的。 此示例看起来与您在上面粘贴的内容有些相似。 我想您已经看到这个例子了。 如果没有、请看一下。
发现问题! 在与另一位工程师一起查看原理图时、发现 SSI0芯片选择未连接到 microSD 卡。 一切都在进行中。 感谢您的支持。