OpenEdv-开源电子网

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

STM32单线双向SPI速度超慢

[复制链接]

18

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-11-12
在线时间
34 小时
发表于 2015-12-18 18:48:52 | 显示全部楼层 |阅读模式
5金钱
请教原子哥和给位大神我使用STM32 SPI单线双向SPI驱动我的SPI LCD  LCD的接口有 Rest, SCK, SDA,  AO  LED背光,V+ GND引脚     LCD  的驱动我已经使用模拟SPI实现读写功能但是刷屏的速度太慢,我想改用单线双向SPI驱动,根据手册的讲述修改了相应的寄存器,但是刷屏的速度太慢,不知道我写的对不对,请教大家帮我看看


下面是我贴出的初始化代码:只修改了初始化部分 希望大家有时间帮我看看,感谢大家!


void SPI1_Init(void)
{


  RCC->APB2ENR|=1<<2;       //PORTA时钟使能  
RCC->APB2ENR|=1<<12;      //SPI1时钟使能 
  
//这里只针对SPI口初始化
GPIOA->CRL&=0X000FFFFF; 
GPIOA->CRL|=0XBBB00000;//PA5.6.7复用    
GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉


/*
 配置单线双向传输
*/
SPI1->CR1|=1<<15;//全双工
SPI1->CR1|=1<<14;//全双工


SPI1->CR1|=0<<10;//全双工
SPI1->CR1|=1<<9; //软件nss管理
SPI1->CR1|=1<<8;  

SPI1->CR1|=1<<2; //SPI主机
SPI1->CR1|=0<<11;//8bit数据格式
SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
SPI1->CR1&=~(1<<0); //数据采样从第二个时间边沿开始,CPHA=1  
SPI1->CR1|=1<<3; //Fsck=Fcpu/2
SPI1->CR1|=2<<7; //MSBfirst   
SPI1->CR1|=1<<6; //SPI设备使能
}

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

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11554
金钱
11554
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-12-19 13:13:13 | 显示全部楼层
单线双向,是什么意思?
回复

使用道具 举报

18

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-11-12
在线时间
34 小时
 楼主| 发表于 2015-12-21 10:47:20 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
就是只是用STM32的MOSI CS CLK  MOSI既能做输出也能做输入,分时使用的
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-11-16
在线时间
2 小时
发表于 2015-12-21 11:27:48 | 显示全部楼层
何必单向呢。。。
回复

使用道具 举报

18

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-11-12
在线时间
34 小时
 楼主| 发表于 2015-12-21 14:44:10 | 显示全部楼层
回复【4楼】philip5966:
我的这块液晶是1.8寸 SPI接口的,上面的引脚又  SCK(时钟)  SDA(数据)    CS(片选)  AO(命令)   SDA就对应SPI的MOSI,如果想实现读LCD中RAM的功能就要想通过SDA引脚想LCD控制器发送8位的读命令然后将单片机的io口设置成输入模式,就可以通过SDA读数据了,读的功能我已经通过模拟的SPI实现了,现在就想换成SPI的方式,除了使用单线双向的方式,我是想不出别的办法了,有人说可以吧单片机的MOSI与MISO连接在一起,使用全双工的方式,不过,既然STM32既然有单线收发的功能,我就想使用这种功能
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11554
金钱
11554
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-12-21 14:49:04 | 显示全部楼层
回复【5楼】踏雪寻玫:
---------------------------------
有这种功能吗?
把你资料放上来,告诉我那一页。
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-11-16
在线时间
2 小时
发表于 2015-12-21 15:01:46 | 显示全部楼层
回复【5楼】踏雪寻玫:
---------------------------------
明白你的意思了,刷屏速度慢可能是io口读写速度受限,等等大神解答吧。
回复

使用道具 举报

18

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-11-12
在线时间
34 小时
 楼主| 发表于 2015-12-21 17:35:23 | 显示全部楼层
回复【6楼】xuande:
---------------------------------
STM32中文参考手册  第22.3.4章 大概在428页
回复

使用道具 举报

7

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2015-12-11
在线时间
42 小时
发表于 2015-12-22 16:53:11 | 显示全部楼层
回复【8楼】踏雪寻玫:
---------------------------------
当然慢了,I/O口要不断改变工作模式
回复

使用道具 举报

18

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-11-12
在线时间
34 小时
 楼主| 发表于 2015-12-22 17:07:15 | 显示全部楼层
回复【9楼】爱吃排骨的蛋炒饭:
---------------------------------
使用的是STM 硬件SPI 只是不是全双工而是单线双向的模式,
回复

使用道具 举报

7

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2015-12-11
在线时间
42 小时
发表于 2015-12-23 12:32:36 | 显示全部楼层
回复【10楼】踏雪寻玫:
---------------------------------
硬件SPI或者IO模拟SPI,一根线Write和Read时IO当然要配置不同的工作模式咯
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-16
在线时间
3 小时
发表于 2016-9-1 20:01:06 | 显示全部楼层
楼主的问题解决了吗?我现在也是遇到同样的问题,串口液晶是3线制。怎么才能用STM32的单线双向SPI呢。感觉确实是读的时候出现超时,以至于刷屏非常慢,且读失败》
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-11-30
在线时间
1 小时
发表于 2016-11-30 16:29:53 | 显示全部楼层
我也遇到类似的问题了,单线从机速度太慢
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-1-5
在线时间
3 小时
发表于 2018-1-5 17:31:35 | 显示全部楼层
踏雪寻玫 发表于 2015-12-22 17:07
回复【9楼】爱吃排骨的蛋炒饭:
---------------------------------
使用的是STM&nbsp;硬件SPI&nbsp;只是不 ...

我用STM32F373驱动ILI9342,就是用的SPI的单线半双工方式。向ILI9342发送数据没有问题。LCD可以正常显示。但是从ILI9342读取GRAM数据中的数据时(发送0x2E指令),可以成功读取到一个pixel的显示数据。但是后续就再也不能控制ILI9342了,经过调试发现只要发送了0x2E指令,就不能控制ILI9342
SPI初始化代码:
   SPI_Cmd(SPI2, DISABLE);  
         
   SPI_StructInit(&SPI_InitStructure);
   //SPI2 Config
   SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;

   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
   SPI_InitStructure.SPI_CRCPolynomial = 7;
   SPI_Init(SPI2, &SPI_InitStructure);
   //Enable SPI2
   SPI_Cmd(SPI2, ENABLE);

   SPI_NSSInternalSoftwareConfig(SPI2, SPI_NSSInternalSoft_Set);


准备接受数据时执行:SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Rx); ,让SPI总线处于接受模式。
接受完毕后执行:SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Tx); 将SPI总线切回发送模式。

回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-1-5
在线时间
3 小时
发表于 2018-1-5 17:34:17 | 显示全部楼层
踏雪寻玫 发表于 2015-12-22 17:07
回复【9楼】爱吃排骨的蛋炒饭:
---------------------------------
使用的是STM&nbsp;硬件SPI&nbsp;只是不 ...

你用的LCD 也是ILI9342吗?不知道为什么我用软件模拟SPI时, 写显示数据正常。读显示数据时,往ILI9342发送0X2E后,没有任何数据返回。
回复

使用道具 举报

18

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
377
金钱
377
注册时间
2013-3-1
在线时间
50 小时
发表于 2018-9-20 21:54:59 | 显示全部楼层
yangwc 发表于 2018-1-5 17:34
你用的LCD 也是ILI9342吗?不知道为什么我用软件模拟SPI时, 写显示数据正常。读显示数据时,往ILI9342发 ...

你的问题解决了吗?

我也发现用软件模拟spi读写正常,

但是硬件spi写没问题,读的时候会出来多余的clock 导致读不正确  液晶初始化不成功

ili9325   
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 04:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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