OpenEdv-开源电子网

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

f103zet6使用SPI1驱动SD卡文件系统

[复制链接]

4

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2016-1-25
在线时间
75 小时
发表于 2016-11-1 10:29:33 | 显示全部楼层 |阅读模式
3金钱
最近在SD卡,由于产品硬件限制,只能使用SPI1接口驱动SD卡:
1. 直接在f103zet6的FATFS例程中修改,将SPI2的相应IO设置及相关语句改为SPI1,结果SD卡读取不正常;
2. 将迷你版的FATFS例程中的SPI1和MMC_SD文件直接复制到f103zet6的FATFS例程中,还是不行;
3. 将迷你版的FATFS例程中的芯片选择直接改为f103zet6,修改LCD文件内容,又是卡在SD卡。

难道这里仅仅是因为SPI1和SPI2的时钟总线不一样么,该怎么改呢,还有哪些细节需要注意呢,不知道怎么搞了

最佳答案

查看完整内容[请看2#楼]

问题解决了,解决的有点莫名其妙 1. 直接在spi.c 文件添加关于SPI1的函数,再修正mmc_sd.c里面的相应代码,就可以了,居然 2. 感觉另一方面,还是硬件跳线有问题,可能接触不良,有时候得把MISO接线插拔一次,SD卡的初始化才成功 [mw_shl_code=c,true] void SPI2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2016-1-25
在线时间
75 小时
 楼主| 发表于 2016-11-1 10:29:34 | 显示全部楼层
问题解决了,解决的有点莫名其妙
1. 直接在spi.c 文件添加关于SPI1的函数,再修正mmc_sd.c里面的相应代码,就可以了,居然
2. 感觉另一方面,还是硬件跳线有问题,可能接触不良,有时候得把MISO接线插拔一次,SD卡的初始化才成功

[mw_shl_code=c,true]


void SPI2_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
          SPI_InitTypeDef  SPI_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTB????
        RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2????        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15??????
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//???GPIOB

        GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15??

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //??SPI???????????:SPI??????????
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //??SPI????:????SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //??SPI?????:SPI????8????
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //???????????????
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //?????????????(?????)?????
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS?????(NSS??)????(??SSI?)??:??NSS???SSI???
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //??????????:????????256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //???????MSB???LSB???:?????MSB???
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC???????
        SPI_Init(SPI2, &SPI_InitStructure);  //??SPI_InitStruct???????????SPIx???
        SPI_Cmd(SPI2, ENABLE); //??SPI??
        SPI2_ReadWriteByte(0xff);//????                 
}   
  
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
{
          assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
        SPI2->CR1&=0XFFC7;
        SPI2->CR1|=SPI_BaudRatePrescaler;        //??SPI2??
        SPI_Cmd(SPI2,ENABLE);

}

u8 SPI2_ReadWriteByte(u8 TxData)
{               
        u8 retry=0;                                        
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //?????SPI???????:????????
                {
                retry++;
                if(retry>200)return 0;
                }                          
        SPI_I2S_SendData(SPI2, TxData); //????SPIx??????
        retry=0;

        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)//?????SPI???????:?????????
                {
                retry++;
                if(retry>200)return 0;
                }                                                              
        return SPI_I2S_ReceiveData(SPI2); //????SPIx???????                                            
}




void SPI1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
          SPI_InitTypeDef  SPI_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );//PORTA????
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_SPI1,  ENABLE );//SPI1????        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PA.5/6/7
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);//???GPIOA

        GPIO_SetBits(GPIOA,GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);  ////PA.5/6/7=1

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;               
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;               
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;               
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;       
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;               
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;               
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       
        SPI_InitStructure.SPI_CRCPolynomial = 7;       
        SPI_Init(SPI1, &SPI_InitStructure);  
        SPI_Cmd(SPI1, ENABLE); //
        SPI1_ReadWriteByte(0xff);                 
}   
//SPI ??????
//SpeedSet:
//SPI_BaudRatePrescaler_2   2??   
//SPI_BaudRatePrescaler_8   8??   
//SPI_BaudRatePrescaler_16  16??  
//SPI_BaudRatePrescaler_256 256??
  
void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
        SPI1->CR1&=0XFFC7;
        SPI1->CR1|=SPI_BaudRatePrescaler;       
        SPI_Cmd(SPI1,ENABLE);
}

u8 SPI1_ReadWriteByte(u8 TxData)
{               
        u8 retry=0;                                        
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
                {
                retry++;
                if(retry>200)return 0;
                }                          
        SPI_I2S_SendData(SPI1, TxData);
        retry=0;

        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
                {
                retry++;
                if(retry>200)return 0;
                }                                                              
        return SPI_I2S_ReceiveData(SPI1);                     
}




[/mw_shl_code]
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 19:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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