7340|4

54

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

stm32的奇怪SPI2问题?求解 [复制链接]

现象:使用stm32的SPI2读写铁电FM25L512,软件IAR 5.4,仿真器JTAGE。
接上仿真器,使用硬件SPI2读写正常;把仿真器去掉开机,硬件SPI2读写错误,其它程序正常。

该用软件SPI2读写,带上仿真器正常,不带仿真器也正常。

附硬件SPI2初始化程序:
void SPI2Init(void)
{   
    SPI_InitTypeDef  SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
               
        //启动SPI时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
        //下面是SPI相关GPIO初始化//
        //SPI2模块对应的SCK、MISO、MOSI为AF引脚
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        //////SPI模块配置//////
        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_128;      //
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                        //高位先发
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPI2, &SPI_InitStructure);
        SPI_Cmd(SPI2, ENABLE);
}
此帖出自stm32/stm8论坛

最新回复

是的哦 我也遇到了 仿真的时候可以 DR 有数据 但是测试的时候就没有了 STM32  107的 我是直接操作寄存器的 我试了几次 好像 GPIOA 复用 并且输出50Mhz频率 PA7会有高电平出现 一直持续 和DR中的数据不一致 是不是 硬件本身的问题??  详情 回复 发表于 2012-5-10 12:55
点赞 关注
 

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 请用示波器看看,接上仿真器与去掉仿真器时,SPI的信号有什么不同。
此帖出自stm32/stm8论坛
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 最近也在调这个铁电存储器,但是始终回读不到发回来的信号,楼主能否给点建议呢
此帖出自stm32/stm8论坛
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
/*结合上面的初始化程序,就是这个FRAM的驱动,希望对你有帮助*/

#define  WREN_CMD         0x06
#define  WRDI_CMD         0x04
#define  WRSR_CMD         0x01
#define  RDSR_CMD         0x05  
#define  WRITE_CMD        0x02
#define  READ_CMD         0x03  


//读或写一个直接
//返回读写是否成功标记。 1失败,0成功。
UCHAR SPI_ReadWriteByte(UCHAR TxData,UCHAR *RxData)
{
    USHORT cw=0,cr=0;
   
        //等待发送缓冲区空
        while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)
        {
            if(++cw > 60000)return 1;
        }
        //发一个字节
        SPI_I2S_SendData(SPI2, TxData);

        //等待数据接收
        while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)
        {
            if(++cr > 60000)return 1;   
        }
        //取数据
        *RxData = SPI_I2S_ReceiveData(SPI2);

        return 0;
}

//SPI写一个字节
void SPIWriteByte(UCHAR nByte)
{
    UCHAR rd;
   
        SPI_ReadWriteByte(nByte,&rd);
}

//SPI读一个字节
UCHAR SPIReadByte(void)
{
    UCHAR data;
        
        SPI_ReadWriteByte(0xA5,&data);   //0xA5是dummy data
        
        return data;
}

/*-----------------------------------------------------------*/
/*
* 函数:
*
* 入口:
*
* 出口:
*
* 说明: 写FRAM函数
*
* 创建:
*
*/
//写一个字节到FRAM
void FMWriteOne(USHORT nFMAddr,UCHAR nFMData)
{
        FM_CS_0;
        SPIWriteByte(WREN_CMD);  
        FM_CS_1;
        DelayNOP(10);
        
        FM_CS_0;
        SPIWriteByte(WRITE_CMD);
        SPIWriteByte((UCHAR)(nFMAddr>>8));
        SPIWriteByte((UCHAR)(nFMAddr&0x00ff));
        SPIWriteByte(nFMData);
        FM_CS_1;
}

//连续写N个字节到FRAM
UCHAR FMWriteSerial(USHORT nFMAddr,USHORT nFMNum,UCHAR *nFMData)
{
    USHORT i;
    UCHAR xor;          //写的同时进行异或
   
        xor = 0;
        
        FM_CS_0;
        SPIWriteByte(WREN_CMD);  
        FM_CS_1;
        Delayms(3);

        FM_CS_0;
        SPIWriteByte(WRITE_CMD);
        SPIWriteByte((UCHAR)(nFMAddr>>8));
        SPIWriteByte((UCHAR)(nFMAddr&0x00ff));
        for(i=0;i<nFMNum;i++)
        {
            SPIWriteByte(*nFMData);
            xor = xor ^ (*nFMData);
            nFMData++;
        }
        FM_CS_1;   
        
        return xor;
}



/*-----------------------------------------------------------*/
/*
* 函数:
*
* 入口:
*
* 出口:
*
* 说明: 读FRAM函数
*
* 创建:
*
*/
//从FRAM里读出一个字节
UCHAR FMReadOne(USHORT nFMAddr)
{
    UCHAR nData;
        
        FM_CS_0;  
        
        SPIWriteByte(READ_CMD);        
        SPIWriteByte((UCHAR)(nFMAddr>>8));
        SPIWriteByte((UCHAR)(nFMAddr&0x00ff));
        nData = SPIReadByte();
        
        FM_CS_1;
        
        return nData;
}

//从FRAM里连续读出N个字节
UCHAR FMReadSerial(USHORT nFMAddr,USHORT nFMNum,UCHAR *nFMData)
{
    USHORT i;
    UCHAR xor;
   
        xor = 0;
        
        FM_CS_0;  
        
        SPIWriteByte(READ_CMD);        
        SPIWriteByte((UCHAR)(nFMAddr>>8));
        SPIWriteByte((UCHAR)(nFMAddr&0x00ff));
        for(i=0;i<nFMNum;i++)
        {
            *nFMData = SPIReadByte();
            xor = xor ^ *nFMData;
            nFMData++;
        }
        FM_CS_1;
        
        return xor;
}

//从FRAM读出数据后校验
UCHAR FMCheck(USHORT nFMAddr,USHORT nFMNum)
{
    USHORT i;
    UCHAR xor,data;
   
        xor=0;
        
        FM_CS_0;  
        
        SPIWriteByte(READ_CMD);        
        SPIWriteByte((UCHAR)(nFMAddr>>8));
        SPIWriteByte((UCHAR)(nFMAddr&0x00ff));
        for(i=0;i<nFMNum;i++)
        {
            data = SPIReadByte();
            xor = xor ^ data;
        }
        FM_CS_1;     
        
        return xor;
}

/*-----------------------------------------------------------*/
/*
* 函数:
*
* 入口:
*
* 出口:
*
* 说明: 读FRAM状态
*
* 创建:
*
*/
UCHAR FMReadStatus(void)
{
    UCHAR nStatus;
        
        FM_CS_0;
        
        SPIWriteByte(RDSR_CMD);
        nStatus = SPIReadByte();
        
        FM_CS_1;
        
        return nStatus;
}


/*-----------------------------------------------------------*/
/*
* 函数:
*
* 入口:
*
* 出口:
*
* 说明: 写FRAM状态
*
* 创建:
*
*/
void FMWriteStatus(UCHAR nStatus)
{   
        FM_CS_0;
        SPIWriteByte(WREN_CMD);  
        FM_CS_1;
        DelayNOP(10);
        
        FM_CS_0;
        SPIWriteByte(WRSR_CMD);
        SPIWriteByte(nStatus);
        FM_CS_1;
}
此帖出自stm32/stm8论坛
 
 
 

回复

43

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 楼主 酒壶 的帖子

是的哦
我也遇到了 仿真的时候可以 DR 有数据
但是测试的时候就没有了
STM32  107的

我是直接操作寄存器的

我试了几次 好像 GPIOA 复用 并且输出50Mhz频率

PA7会有高电平出现 一直持续 和DR中的数据不一致


是不是 硬件本身的问题??
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表