所用芯片:TM4C1294NCPDT
所用模块:W25Q16
以下为初始化SSI2的函数:
void W25QXX_Init_2(void)//初始化SSI2
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);//使能SPI2时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);//使能GPIOD时钟
SysCtlPeripheralReset(SYSCTL_PERIPH_SSI2);
//SPI2 IO 口定义
GPIOPinConfigure(GPIO_PD3_SSI2CLK);
GPIOPinConfigure(GPIO_PD0_SSI2XDAT1);//MISO
GPIOPinConfigure(GPIO_PD1_SSI2XDAT0);//MOSI
GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3);
SSIConfigSetExpClk(SSI2_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,SSI_MODE_MASTER, 1000000, 8);
SSIEnable(SSI2_BASE);//使能SPI2
uint32_t dummy[1];
while(SSIDataGetNonBlocking(SSI2_BASE, &dummy[0]));
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_2);//PD2为片选
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_2, 0xFF);
}
此处应注意两点,一是配置时钟极性和相位时,主设备的时钟极性和相位与从设备
的时钟和相位正好相反。此处W25Q16模块,查看其对应手册可知,该模块时钟线
在空闲时为高电平(即CPOL Clock Polarity 为1),在SCK第二个跳变沿采样(CPHA
Clock Phase为1),即mode3模式,那么对应的主机配置时就应该选择mode0模式。
二是时钟取系统时钟,但是SysCtlClockGet()函数好像有点问题,大家可以试试
ROM_SysCtlClockGet()函数来获取系统时钟,如果这个也不行就只能自己配置系
统时钟。
后续的关于W25Q16的具体读写操作函数就不赘述了,如有需要可以私信我。