OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9523|回复: 2

求助 SPI在运行中切换速率的问题。

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2012-3-5
在线时间
2 小时
发表于 2012-3-5 12:43:48 | 显示全部楼层 |阅读模式
自己画了个板子。自己以为明白了。于是把触摸屏,Flash的SPI接口共用了SPI1。Flash是高速的可以直接36M不分频。触摸控制芯片是AD7843SPI速度快了会出错,于是我想在用触摸的时候把SPI速度换为64分频。用Flash时候换为不分频。而且之前也查过,只要在设置SPI之前关闭了SPI就可以再次设置。于是就这么做了......但是板子做回来才知道不行,我每次如果只改SPI中的分频,再使能SPI并不能达到效果。一定要再重新完全初始化一次。这样太费时间了,有哪位大神遇到过了。(直接操作寄存器,或者用库函数都不行)

单独使用其中一个都是可以的。就是不能这样更改速度。求教了


下面贴下问题代码。


u8 SPI1_Mode = 0;
不分频
void SPI1_TurnToFlash(void)
{
if(SPI1_Mode != SPI1_Flash)
{
// SPI_Cmd(SPI1, DISABLE);//关闭
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, DISABLE);
// SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
// SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
// SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
// SPI_Init(SPI1, &SPI_InitStructure);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
// SPI_Cmd(SPI1, ENABLE);//启动SPI1
                
SPI1->CR1 &= ~(1<<6);//关闭SPI
SPI1->CR1 &= ~(1<<3);
SPI1->CR1 &= ~(1<<5);//分频改变
SPI1->CR1 |= (1<<6);//启动SPI
SPI1_Mode = SPI1_Flash;
}
}

64分频
void SPI1_TurnToTouch(void)
{
if(SPI1_Mode != SPI1_Touch)
{
// SPI_Cmd(SPI1, DISABLE);//关闭
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, DISABLE);
// SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
// SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;  
// SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
// SPI_Init(SPI1, &SPI_InitStructure);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
// SPI_Cmd(SPI1, ENABLE);//启动SPI1
                
SPI1->CR1 &= ~(1<<6);
SPI1->CR1 |= (1<<3);
SPI1->CR1 |= (1<<5);
SPI1->CR1 |= (1<<6);
SPI1_Mode = SPI1_Touch;
}
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-5 13:00:27 | 显示全部楼层
参考我们的sd卡实验例子。
sd卡初始化的时候,速度只能在400K以内。初始化以后可以达到18M。
这里就用了切换速度,没你说的那么复杂。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2012-3-5
在线时间
2 小时
 楼主| 发表于 2012-3-5 16:12:32 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我在网上看到的都是说要先关了SPI再设置。于是我就那么傻里吧唧的弄了。
试试原子大大的可以不,我那个就是不行


void SPIx_SetSpeed(u8 SpeedSet)
{
SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256
if(SpeedSet==SPI_SPEED_2)//二分频
{
SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz
}else if(SpeedSet==SPI_SPEED_8)//八分频 
{
SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz
}else if(SpeedSet==SPI_SPEED_16)//十六分频
{
SPI1->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
}else    //256分频
{
SPI1->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz 低速模式
}
//SPI1->CR1|=1<<6; //SPI设备使能   
/* Enable SPI1  */
SPI_Cmd(SPI1, ENABLE); //使能SPI外设
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 01:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表