OpenEdv-开源电子网

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

模拟SPI

[复制链接]

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
发表于 2014-4-7 22:09:36 | 显示全部楼层 |阅读模式
仿照别人的方法模拟的SPI,可是为什么不行呢
void SPI_Init(void)
{
RCC->APB2ENR|= 1<<2;//打开Porta端口的时钟 
GPIOA->CRL&=0XFFFFF000;    //PA0为MOSI,PA1为MISO,PA2为时钟线
GPIOA->CRL|=0xfffff383;    //MOSI 时钟线推挽输出,MISO上拉输入
GPIOA->ODR|=1<<0;       //上拉
GPIOA->ODR|=1<<2; 
}   
//SPI写一个字节
void SPI_WRITE_BYTE(u8 date)
{
u8 i;
SPI_CLK=1;
for(i=0;i<8;i++)
{
MOSI=(date&0x80)?1:0;
SPI_CLK=0;
delay_us(2);
SPI_CLK=1;
delay_us(2);
date<<=1;
}
}
//SPI 读一个字节
u8 SPI_READ_BYTE(void)
{
u8 i;
u8 temp=0;
SPI_CLK=1;
for(i=0;i<8;i++)
{
temp<<=1;
SPI_CLK=0;
delay_us(2);
temp|=MISO;
SPI_CLK=1;
delay_us(2);
}
return temp;
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-7 22:45:27 | 显示全部楼层
readwrite应该一起才是。
你驱动什么芯片?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2014-4-7
在线时间
0 小时
发表于 2014-4-7 23:04:11 | 显示全部楼层
        原子哥,我驱动25Q128  用你例程里驱动25X16的程序可以么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-7 23:44:55 | 显示全部楼层
可以,稍改一下ID即可。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-8 08:17:01 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
驱动W25Q64,就是开发板的例程,我想用模拟SPI 来驱动
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-8 08:19:11 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我看有的人把write和read分开了(不知道是不是对的),有的人是写在一起了,难道这两个函数必须要写成一个函数吗?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-8 08:35:22 | 显示全部楼层
回复【6楼】Along:
---------------------------------
速度不快的前提下可以分开来的,如果速度快的话就没办法了,调用函数还要时间的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-8 09:32:48 | 显示全部楼层
回复【7楼】Badu_Space:
---------------------------------
请问选件模拟SPI 可以用来驱动W25Q64吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-8 09:36:16 | 显示全部楼层
回复【6楼】Along:
---------------------------------
SPI是读写一体的,写成一个函数就够了
2个也是可以,无非就是读的时候,输出(MOSI)一直设置为1就是了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-8 10:13:34 | 显示全部楼层
回复【8楼】Along:
---------------------------------
可以
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-8 17:52:07 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
我用你说的writeread写在一起,用JTAG 调试还是读不到值
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-8 19:06:56 | 显示全部楼层
回复【11楼】Along:
---------------------------------
这就要检查代码了,呵呵。
你是驱动25Q64?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-8 19:12:29 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
这个驱动25Q64有什么问题吗?
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-8 19:13:49 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
我JTAG调试SPI的读写函数时,读不到值,返回值一直是0
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-8 20:33:05 | 显示全部楼层
回复【13楼】Along:
---------------------------------
没问题。
回复【14楼】Along:
---------------------------------
你的片选信号呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-8 21:13:54 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
片选信号应该放哪里?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-8 22:46:37 | 显示全部楼层
这。。。
要先拉低片选,再开始传输的了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-9 16:20:15 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
我调试出来了,不是没有片选信号,因为片选信号在W25Q64的初始化时定义了。我上面的错误是引脚弄错,应该是下面这样
void SPI_Init(void)
{
RCC->APB2ENR|= 1<<3;//打开Portb端口的时钟 
GPIOB->CRH&=0X000FFFFF;    //PB15为MOSI,PB14为MISO,PB13为时钟线
GPIOB->CRH|=0x383fffff;    //MOSI 时钟线推挽输出,MISO上拉输入
GPIOB->ODR|=1<<12;       //上拉
// GPIOB->ODR|=1<<15; 
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-9 17:11:15 | 显示全部楼层
回复【18楼】Along:
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-9 17:17:15 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
又出现新问题了,我用JTAG 调试,程序就卡在写入W25Q64
在这个函数
void SPI_Flash_Wait_Busy(void)   
{   
while((SPI_Flash_ReadSR()&0x01)==0x01);   // 等待BUSY位清空
}  
就走不动了
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-9 21:16:23 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
原子哥,我还想问你,无线通信实验怎么控制发送和接收的信息。
为什么我做的无线通信,发送出去的和接收到的都是乱码
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-9 23:12:55 | 显示全部楼层
回复【21楼】Along:
---------------------------------
宏定义里面,就确定了每次收发数据的长度,地址是通过两个数组确定的。
然后你要发送的时候,就调用我们的发送函数,输入宏定义里面设置好的长度的数据,就可以发送了
接收也是调用我们提供的接收函数,查询一下即可。

至于你的乱码,我不知道你是不是方法有问题了。。。
很多人ASCII内码和16进制数据都搞不清白,你看看是不是也是这个问题?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-4-10 15:45:23 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
弄错了,我的实验结果和开发指南的实验结果是一样的。
我是想问,我们只定义可每次收发的长度和地址,那我们怎么改变我们要收发的数据?难道只能收发默认的数据?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-11 00:03:58 | 显示全部楼层
回复【23楼】Along:
---------------------------------
修改发送数组的内容即可。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2013-12-17
在线时间
80 小时
发表于 2016-8-11 10:36:34 | 显示全部楼层
SPI读写一定要在一个函数里吗?我是用IO口模拟SPI工作,现在貌似是写不进去,现在只能读芯片ID
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 20:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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