OpenEdv-开源电子网

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

SPI

[复制链接]

30

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-8-29
在线时间
17 小时
发表于 2016-1-15 10:01:06 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 天魂 于 2016-1-15 10:31 编辑

void SPI_Flash_Init(void)
{

        GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;  //SPI CS
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
         GPIO_Init(GPIOA, &GPIO_InitStructure);
         GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
        SPI1_Init();                   //3õê¼»ˉSPI
        SPI1_SetSpeed(SPI_BaudRatePrescaler_4);        //éèÖÃÎa18Mê±Öó,¸ßËùÄ£ê½
        SPI_FLASH_TYPE=SPI_Flash_ReadID();//¶áè¡FLASH ID.
}  

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;  //SPI CS
请问GPIOA3和4是拿来干嘛的?我看图上标记好像和SPI一点关系都没有啊。

void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{
        u16 i;                                                                                                        
        SPI_FLASH_CS=0;                            //ê1ÄüÆ÷¼t   
    SPI1_ReadWriteByte(W25X_ReadData);         //·¢Ëí¶áè¡Ãüáî   
    SPI1_ReadWriteByte((u8)((ReadAddr)>>16));  //·¢Ëí24bitμØÖ·   
    SPI1_ReadWriteByte((u8)((ReadAddr)>>8));   
    SPI1_ReadWriteByte((u8)ReadAddr);   
    for(i=0;i<NumByteToRead;i++)
        {
        pBuffer=SPI1_ReadWriteByte(0XFF);   //&#209;-&#187;·&#182;áêy  
    }
        SPI_FLASH_CS=1;                            //è&#161;&#207;&#251;&#198;&#172;&#209;&#161;                  
}  
pBuffer=SPI1_ReadWriteByte(0XFF);  
这里的0xff是什么意思。


图片1.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2016-1-15 10:22:12 | 显示全部楼层
和SPI有关系的,看一下从机侧的文档。
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

30

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-8-29
在线时间
17 小时
 楼主| 发表于 2016-1-15 10:32:01 | 显示全部楼层
emWin 发表于 2016-1-15 10:22
和SPI有关系的,看一下从机侧的文档。

什么从机侧
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2016-1-10
在线时间
2 小时
发表于 2016-1-15 10:40:46 | 显示全部楼层
这不是光盘里的吗?
回复

使用道具 举报

30

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-8-29
在线时间
17 小时
 楼主| 发表于 2016-1-15 10:43:27 | 显示全部楼层
u16 SPI_Flash_ReadID(void)
{
        u16 Temp = 0;          
        SPI_FLASH_CS=0;                                    
        SPI1_ReadWriteByte(0x90);//·¢&#203;í&#182;áè&#161;ID&#195;üá&#238;            
        SPI1_ReadWriteByte(0x00);             
        SPI1_ReadWriteByte(0x00);             
        SPI1_ReadWriteByte(0x00);                                    
        Temp|=SPI1_ReadWriteByte(0xFF)<<8;  
        Temp|=SPI1_ReadWriteByte(0xFF);         
        SPI_FLASH_CS=1;                                    
        return Temp;
}                       


我把Temp|=SPI1_ReadWriteByte(0xFF)<<8;  
        Temp|=SPI1_ReadWriteByte(0xFF);         
改为Temp|=SPI1_ReadWriteByte(0x00)<<8;  
        Temp|=SPI1_ReadWriteByte(0x00);         
单片机还是能检测到ID
回复

使用道具 举报

30

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-8-29
在线时间
17 小时
 楼主| 发表于 2016-1-15 10:48:54 | 显示全部楼层
u8 SPI1_ReadWriteByte(u8 TxData)
{               
        u8 retry=0;                                        
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //&#188;ì2é&#214;&#184;&#182;¨μ&#196;SPI±ê&#214;&#190;&#206;&#187;éè&#214;&#195;ó&#235;·&#241;:·¢&#203;í&#187;o′&#230;&#191;&#213;±ê&#214;&#190;&#206;&#187;
                {
                retry++;
                if(retry>200)return 0;
                }                          
        SPI_I2S_SendData(SPI1, TxData); //í¨1yíaéèSPIx·¢&#203;íò&#187;&#184;&#246;êy&#190;Y
        retry=0;

        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//&#188;ì2é&#214;&#184;&#182;¨μ&#196;SPI±ê&#214;&#190;&#206;&#187;éè&#214;&#195;ó&#235;·&#241;:&#189;óêü&#187;o′&#230;·&#199;&#191;&#213;±ê&#214;&#190;&#206;&#187;
                {
                retry++;
                if(retry>200)return 0;
                }                                                              
        return SPI_I2S_ReceiveData(SPI1); //·μ&#187;&#216;í¨1ySPIx×&#238;&#189;ü&#189;óê&#213;μ&#196;êy&#190;Y                                            
}
为什么要把读写函数写在一个函数里面,有什么特别的作用吗?

我感觉你读的时候根本不需要先写一个数据啊,
写的时候,也不需要读什么东西出来啊
回复

使用道具 举报

3

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2015-3-7
在线时间
43 小时
发表于 2016-1-15 14:46:15 | 显示全部楼层
你没有很好的理解好SPI的通信协议。
SPI是全双工同步传输的,你要读数据的出来,要发送0XFF,不写0xff,写其他的都可以的,意思是要提高8个脉冲时钟。从机在有这8个时钟的情况下,才会发回数据。
为人莫作千年计,三十河东四十西,莫欺少年穷。
回复

使用道具 举报

3

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2015-3-7
在线时间
43 小时
发表于 2016-1-15 14:47:48 | 显示全部楼层
天魂 发表于 2016-1-15 10:48
u8 SPI1_ReadWriteByte(u8 TxData)
{               
        u8 retry=0;                                        

你不写成1个,拆成2个读写函数都是可以的。
为人莫作千年计,三十河东四十西,莫欺少年穷。
回复

使用道具 举报

30

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-8-29
在线时间
17 小时
 楼主| 发表于 2016-1-15 20:27:29 | 显示全部楼层
Mcu_learning 发表于 2016-1-15 14:46
你没有很好的理解好SPI的通信协议。
SPI是全双工同步传输的,你要读数据的出来,要发送0XFF,不写0xff,写 ...

好像有点懂了,写0xff是为了不影响原本存在flash里面的内容。。。写其他,就有可能影响数据。。。。。那可不可以另外写个函数,不读数据,直接读取数据呢?
回复

使用道具 举报

3

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2015-3-7
在线时间
43 小时
发表于 2016-1-15 21:38:49 | 显示全部楼层
写其他的也不会呀。你要看下对应指令的时序。W25Q64的数据手册~
什么是不读数据,直接读取数据。?不管读什么的,要提供8个时钟信号~
为人莫作千年计,三十河东四十西,莫欺少年穷。
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-1-16 07:56:23 | 显示全部楼层
标题请注明什么问题,具体一点,这样太简单了,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 06:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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