怎么将内部16M的时钟作为SSI的时钟源?需要配置哪些寄存器?

2019-07-30 15:21发布

求助各位大神 我的系统时钟设置成80M(这个必须这个不能改了) 而我用ssi读写的EEPROM支持的最大时钟只有20M因此我想用内部的那个PIOSC(16M)作为SSI的时钟源这样跟系统时钟没冲突可以吗?
查看了手册之后我做了如下设置(我的ssi时钟源通过设置ssiicc以piosc为时钟源这样可以吗)结果没用,有懂的吗  怎么配置  需要注意什么?
void SSI_init(void)
{
        HWREG(0x400fe000+ 0x61c) = 0x2;
        //SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1); //为SSI提供时钟
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//为GPIOF端口提供时钟

    //SSIDisable(SSI1_BASE);

    HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;
    HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x1;

    HWREG(SSI1_BASE + SSI_O_CR1) = 0X0;//sse位置0禁能SSI
   //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);

    HWREG(SSI1_BASE + SSI_O_CC) = 0x5;//时钟源选择,该处选中PIOSC
    HWREG(SSI1_BASE + SSI_O_CPSR)= 0x4;//时钟预分频,2-254之间的偶数
    HWREG(SSI1_BASE + SSI_O_CR0)=0x307;//设置SCR,极性,相位,模式,位宽度

   HWREG(SSI1_BASE + SSI_O_CR1) = 0X2;//sse位置1使能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);

    //SSIEnable(SSI1_BASE);

        //  配置片选管脚为输出
    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);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
xyz549040622
1楼-- · 2019-07-31 16:08
sayato 发表于 2015-3-15 19:36
谢谢大哥能认真看完我的帖子,还看饿手册,但是按你说的这个思路,采用系统时钟分频,那个SSICPSR寄存器 ...

至于你说的操作寄存器后没反应的说法,TIVA对初始化的先后顺序都是有要求的,你可以参考官方例程的初始化程序,然后对照数据手册中的顺序看看 QQ截图20150316231142.png
smilingangel
2楼-- · 2019-07-31 21:40
xyz549040622 发表于 2015-3-14 10:56
SSI的时钟可以为系统时钟,也可以为PIOSC,如下图所示

但是因为你的ssi读写的EEPROM支持的最大时钟只有20M ...

楼上的参考图的很直观的。
sayato
3楼-- · 2019-08-01 01:50
xyz549040622 发表于 2015-3-16 23:12
至于你说的操作寄存器后没反应的说法,TIVA对初始化的先后顺序都是有要求的,你可以参考官方例程的初始化 ...

1:那个值在2-254 的确是这样的 ,这个是建立在你直接操作寄存器的基础上的。我把那个库函数计算模型看了一下,如果是调用库函数那个值一般都是2,也可以是其他的除非你的时钟频率特别高,ssi波特率设置的比较小才会是其他值。 ulMaxBitRate = ulSSIClk / ulBitRate;
    ulPreDiv = 0;
    do
    {
        ulPreDiv += 2;
        ulSCR = (ulMaxBitRate / ulPreDiv) - 1;
    }
    while(ulSCR > 255);
    HWREG(ulBase + SSI_O_CPSR) = ulPreDiv;

2:我上面的程序就是按照手册的操作顺序来的,就是你提供的第二张图,说真的 真没反应 头都大了 其中    HWREG(SSI1_BASE + SSI_O_CR1) = 0X0;//sse位置0禁能SSI,这个使能,失能的操作是有用的(测试过),实在搞不定啊 能不能麻烦大哥帮我试试啊,
3;还有个附带的问题 我的CCS 5.5运行的时候怎么观察不了寄存器的值
sayato
4楼-- · 2019-08-01 06:17
smilingangel 发表于 2015-3-17 22:08
楼上的参考图的很直观的。

我就是按照楼上的意思做的,我感觉没什么差错啊,你可以看我的程序 跟手册要求是一致的,
sayato
5楼-- · 2019-08-01 11:32
 精彩回答 2  元偷偷看……
angerbird
6楼-- · 2019-08-01 14:16
时钟源的选择与控制是很重要的。

一周热门 更多>