[求助] 430SPI用SMCLK时钟驱动问题

曾经in   2015-2-11 15:17 楼主
用430的SPI例程修改驱动SPI彩屏,但是刷屏实在太慢了 例程序用LFXTCLK做时钟源ACLK驱动SPI,我试着改成HFXTCLK做时钟源SMCLK驱动 但是没成功,程序卡在等待发送那里,逻辑分析仪显示一个字节都没发出来,好像时钟没给上 改了好久,还是没找到那里出问题,例程也有些不明白的地方,请大家帮忙看看 用的是FR5969 LaunchPad,自己焊了22.1184M晶振22P电容 430SPI例程: GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_PJ,GPIO_PIN4 + GPIO_PIN5,GPIO_PRIMARY_MODULE_FUNCTION); //首先时钟引脚初始化 CS_setExternalClockSource(32768,0); //这里貌似是为之后设置时钟有关的宏观变量 //Set DCO frequency to max DCO setting CS_setDCOFreq(CS_DCORSEL_0,CS_DCOFSEL_3); //DCO为4M.问题1:这里为什么要设置DCO时钟 //Select XT1 as the clock source for ACLK with no frequency divider CS_clockSignalInit(CS_ACLK,CS_LFXTCLK_SELECT,CS_CLOCK_DIVIDER_1); //LFXTCLK做ACLK时钟源 //Start XT1 with no time out CS_LFXTStart(CS_LFXTDRIVE_0); //驱动LFXTCLK晶振, GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2, GPIO_PIN2, GPIO_SECONDARY_MODULE_FUNCTION ); GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_P1, GPIO_PIN6 + GPIO_PIN7, GPIO_SECONDARY_MODULE_FUNCTION ); PMM_unlockLPM5(); //Initialize Master EUSCI_B_SPI_initMasterParam param = {0}; param.selectClockSource = EUSCI_B_SPI_CLOCKSOURCE_ACLK;//用ACLK作SPI时钟 param.clockSourceFrequency = CS_getACLK();//问题2,没弄明白这里做什么用API手册里就一句话Is the frequency of the selected clock source. param.desiredSpiClock = 500000;//这里是设置SPI时钟频率??API手册里说Is the desired clock rate for SPI communication. param.msbFirst = EUSCI_B_SPI_MSB_FIRST;//下面都理解spi的常规设置 param.clockPhase = EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT; param.clockPolarity = EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH; param.spiMode = EUSCI_B_SPI_3PIN; EUSCI_B_SPI_initMaster(EUSCI_B0_BASE, ¶m); 以下是修改的程序 QQ截图20150211104808.png ]RX)RP}$GI)SB$I7$L22{{2.png QQ截图20150211142550.png QQ截图20150211151614.png 本帖最后由 曾经in 于 2015-2-11 15:19 编辑

回复评论 (11)

不知楼主是否之前用过TI的MCU
你那个22M晶振应该是焊在了高速晶振那里,如果你要使用它,就把DCO的语句给替换掉
但,看你程序,你好像在设置低速晶振那里,写了你高速晶振的参数.这里肯定不行.

我的理解答案
问题1:板载未焊接HF晶振,所以使用DCO
问题2:字面意思,理解为取ACK时钟源的时钟

使用例程里的SPI时钟时,你可以再调整大一些试试,比如1Mhz
点赞  2015-2-11 15:40
引用: wgsxsm 发表于 2015-2-11 15:40 不知楼主是否之前用过TI的MCU 你那个22M晶振应该是焊在了高速晶振那里,如果你要使用它,就把DCO的语句给替换掉 但,看你程序,你好像在设置低速晶振那里,写了你高速晶振的参数.这里肯定不行. 我的理解答案 问题1:板载未焊接HF晶振,所以使用DCO 问题2:字面意思,理解为取ACK时钟源的时钟 使用例程里的SPI时钟时,你可以再调整大一些试试,比如1Mhz
之前确实没用过TI的片子 原板没22M,但是有LFXTCLK 32.768k,22M自己加焊,是高速晶振那。DCO的语句给替换掉是什么意思,删掉吗? 不知道例程为什么用LFXTCLK还要设置DCO 设置低速晶振那里,写了你高速晶振的参数说的是这句吗?CS_setExternalClockSource(32768,0); 本帖最后由 曾经in 于 2015-2-11 16:12 编辑
点赞  2015-2-11 16:11
引用: 曾经in 发表于 2015-2-11 16:11
之前确实没用过TI的片子
原板没22M,但是有LFXTCLK 32.768k,22M自己加焊,是高速晶振那。DCO的语句给替换掉是什么意思,删掉吗?
不知道例程为什么用LFXTCLK还要设置DCO
“设置低速晶振那里,写了你高速晶振的参数”说的是这句吗?CS_setExternalClockSource(32768,0);




点赞  2015-2-11 16:13
仔细看一下430手册的时钟管理说明吧
点赞  2015-2-11 16:29

先检查一下你的spi时钟是否正确其实你没必要使用哪个22M的高速时钟,使用32.768kHZ的这个晶振倍频到高速时钟。


点赞  2015-2-11 16:36
引用: IC爬虫 发表于 2015-2-11 16:36
先检查一下你的spi时钟是否正确其实你没必要使用哪个22M的高速时钟,使用32.768kHZ的这个晶振倍频到高速时钟。


总感觉SMCLK和ACLK使用是不是不太一样,32.768K能倍频没找到,倒是DCO时钟可以提供24M

点赞  2015-2-11 21:56
不知道有没使用SMCLK的例程看看
比较一下也许就能知道出什么问题
点赞  2015-2-11 21:58
我之前写过一个程序,可以有8M的刷新率,用寄存器写的,我是用内部的DCO选择成16M时钟,SPI是用的时钟是SMCLK 本帖最后由 强仔00001 于 2015-2-11 23:18 编辑
点赞  2015-2-11 23:17
引用: 强仔00001 发表于 2015-2-11 23:17 我之前写过一个程序,可以有8M的刷新率,用寄存器写的,我是用内部的DCO选择成16M时钟,SPI是用的时钟是SMCLK
SMCLK和MCLK最高都可以到24M吧?用库函数改SMCLK、MCLK或者DCO就不稳定 回头改学寄存器写试试 本帖最后由 曾经in 于 2015-2-17 11:15 编辑
点赞  2015-2-17 10:29
引用: 曾经in 发表于 2015-2-17 10:29
SMCLK和MCLK最高都可以到24M吧?用库函数SMCLK、MCLK或者DCO就不稳定
回头改学寄存器写试试
好像是可以,写寄存器最好不过了,寄存器不是很多,配置起来也不难



点赞  2015-2-17 10:59
24M时钟问题参考下面这贴13楼
https://bbs.eeworld.com.cn/thread-456491-1-1.html
点赞  2015-3-10 15:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复