OpenEdv-开源电子网

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

用IO模拟SPI问题

[复制链接]

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
发表于 2012-3-8 18:34:47 | 显示全部楼层 |阅读模式

#define SD_CS_H  GPIOA->BSRR=1<<3   
#define SD_CS_L  GPIOA->BRR=1<<3
#define SD_DI_H  GPIOA->BSRR=1<<7
#define SD_DI_L  GPIOA->BRR=1<<7
#define SD_CLK_H  GPIOA->BSRR=1<<5
#define SD_CLK_L  GPIOA->BRR=1<<5
#define SD_DO  GPIOA->IDR&(1<<6)
void SdWrite(unsigned char n)
{      
 unsigned char i;
 for(i=8;i;i--)
 {
  SD_CLK_L;
  if(n&0x80)
  {
   SD_DI_H;
  }
  n<<=1;
  SD_CLK_H;
 }
 SD_DI_H;      
}

unsigned char SdRead()
{     
 unsigned char n,i;
 for(i=8;i;i--)
 {
  SD_CLK_L;
  SD_CLK_H;
  n<<=1;
  if(SD_DO) n|=1; 
 }
 return n;       
}

引脚不变,但不使用硬件SPI,使用IO模拟,以上函数是否可行呢?
RCC->APB2ENR|=1<<2;//先使能外设PORTA时钟
 GPIOA->CRL&=0X000F0FFF;
 GPIOA->CRL|=0X38303000;
 GPIOA->ODR|=0XFFFF;
这是IO的设置,现象是初始化失败

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

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-8 19:50:53 | 显示全部楼层
初始化SD也是用这两个函数吗?
注意SD卡在初始化的时候SPI的速度一定要慢。

另外一点,可以先把硬件SPI写或读函数中的一个改成用软件的,调试成功后再改另一个,
不要一下子全上哦。
https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-8 20:42:14 | 显示全部楼层
回复【楼主位】以枫之名:
---------------------------------
SPI读写是一起的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-8 21:22:34 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
这个函数在51上是可以的,用的是同一张SD卡,2G的,1.0协议,把读写分开没关系,实质是同一功能,只是读函数参数是0xff,写函数没返回值而已,但在STM32上却通不过初始化,先不说SPI速率,这样设置IO有错吗?
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-8 21:23:29 | 显示全部楼层
回复【2楼】Pony279:
---------------------------------
SD_CS_H;
for(i=0;i<=10;i++)
SdWrite(0xff);
SD_CS_L;
SdCommand(0x00,0,0x95);
response=SdResponse();
if(response!=0x01)
{
return 0;

while(response==0x01)
{
SD_CS_H;
SdWrite(0xff);
SD_CS_L;
SdCommand(0x01,0x00ffc000,0xff);
response=SdResponse();

SD_CS_H;
SdWrite(0xff);
return 1;

这是初始化函数
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-9 01:12:49 | 显示全部楼层
初始化没错.
应该是SPI速度太快了的缘故,增加延时试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-8-20
在线时间
1 小时
发表于 2012-9-19 16:42:31 | 显示全部楼层
回复【5楼】以枫之名:
回复【2楼】Pony279:
---------------------------------
SD_CS_H;
for(i=0;i<=10;i++)
SdWrite(0xff);
SD_CS_L;
SdCommand(0x00,0,0x95);
response=SdResponse();
if(response!=0x01)
{
return 0;

while(response==0x01)
{
SD_CS_H;
SdWrite(0xff);
SD_CS_L;
SdCommand(0x01,0x00ffc000,0xff);
response=SdResponse();

SD_CS_H;
SdWrite(0xff);
return 1;
这是初始化函数
---------------------------------
请问你的模拟可以了嘛?
回复 支持 反对

使用道具 举报

47

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2013-8-8
在线时间
0 小时
发表于 2014-2-8 20:41:40 | 显示全部楼层
为什么你在写时 是一个时钟写一位,而读时 却来了一个时钟,读走了8位呢
___诺现在就觉得失望无力,未来那么远该怎么扛。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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