这个问题,绞尽脑汁也不知道问题出在哪请求各位大神能帮我解决一下,若能解决在下这个问题,为了表示感谢只能充点电话费聊表心意了,希望不要嫌少。
芯片型号:TM4C1233E6PM; 程序用途:采用SSI读写EEPROM(25LC1024,支持的最大时钟速度为10M ) 系统时钟因其他方面需要设置为80M
这样的话这个就没法玩了啊,所以我想在不改变系统时钟的情况下,将内部精准16M时钟源供给SSI模块,按照手册的设置步骤,经设置之后没有效果。
上面是主时钟树和SSI模块结构框图。
按照这个思路 我的程序如下:
void SSI_init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1); //为SSI提供时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //为GPIOF端口提供时钟
HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;//解锁GPIOF管脚复用功能
HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x1; //写1确认解锁
SSIDisable(SSI1_BASE); //禁能SSI1模块
//HWREG(SSI1_BASE + SSI_O_CR1) = 0X0; //sse位置0,禁能SSI1模块,这个跟上面一句是同样的效果
//SSIClockSourceSet(SSI1_BASE,SSI_CLOCK_PIOSC);//API设置ssi时钟源
//设置SPI为主机模式0,8位数据宽度,1M的波特率//
// SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,SSI_MODE_MASTER, 1000000, 8);
下面的三个函数其实就是把SSIConfigSetExpClk()拆开来实现的!(寄存器操作部分)
HWREG(SSI1_BASE + SSI_O_CC) = 0x5; //时钟源选择,该处选中PIOSC(假设这个地方设置成功,ssi模块时钟位16M)
HWREG(SSI1_BASE + SSI_O_CPSR)= 0x4;//时钟预分频,2-254之间的偶数(在上述基础上根据手册上公式SSINCLK设置其他的参数)
HWREG(SSI1_BASE + SSI_O_CR0)=0x307; //设置SCR,极性,相位,模式,位宽度
//HWREG(SSI1_BASE + SSI_O_CR1) = 0X2;//sse位置1使能SSI
SSIEnable(SSI1_BASE); //使能SSI,这个跟上面一句是同样的效果
GPIOPinConfigure(GPIO_PF3_SSI1FSS); //SSI功能复用配置
GPIOPinConfigure(GPIO_PF2_SSI1CLK);
GPIOPinConfigure(GPIO_PF1_SSI1TX);
GPIOPinConfigure(GPIO_PF0_SSI1RX);
GPIOPinTypeSSI(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
// 配置片选管脚为输出
GPIODirModeSet(GPIO_PORTF_BASE,GPIO_PIN_3, GPIO_DIR_MODE_OUT);
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_3,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
}
问题1:帮我解释一下SSI框架图中红色和蓝色两条时钟线的各自作用?
问题2:我要将内部16M作为SSI模块时钟源,怎么设置寄存器部分?
问题3:上述初始化程序是否有问题,尤其是对寄存器操作的部分?
问题4:系统时钟80M,但是外设EEPROM最大支持20M,有什么办法在不改变系统时钟的情况下能够正常读写外设?