OpenEdv-开源电子网

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

stm32通过spi驱动富士通MB85RS2MT,SPI正常,ID可读,但是不能写数据,请教原因?

[复制链接]

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2017-8-23
在线时间
45 小时
发表于 2020-11-23 16:21:50 | 显示全部楼层 |阅读模式
1金钱
stm32F2通过spi驱动富士通MB85RS2MT,SPI正常,ID可读,但是不能写数据,这边原子论坛也有一个相似的帖子,但是我按照那个帖子的方法也弄不了!!!以下是代码:
void SPI_write_MB85RS2MT(uint8_t data,u16 address)
{
        uint8_t addr_tempH, addr_tempL;
       
        addr_tempH = (uint8_t)((address&0xff00)>>8);   //获取高8位地址
        addr_tempL = (uint8_t)(address&0x00ff);        //获取低8位地址
        MB_CS_L;
        SPIx_ReadWriteByte(MB85RS2MT_WREN_INST);    //写使能
        MB_CS_H;
        delayus(10);
        MB_CS_L;
        SPIx_ReadWriteByte(MB85RS2MT_WRITE_INST);   //写存储器寄存器操作吗
        SPIx_ReadWriteByte(addr_tempH);            //写入高八位地址,高3位忽略
        SPIx_ReadWriteByte(addr_tempL);            //
        SPIx_ReadWriteByte(data);                  //写入数据
        MB_CS_H;
}

/*******************************************************************************
* @brief  读出特定地址空间的数据
*
* @param  u16 address
* @return uint8_t
*******************************************************************************/
uint8_t SPI_read_MB85RS2MT(uint16_t address)
{
        uint8_t dat, addr_tempH, addr_tempL;
       
        addr_tempH = (uint8_t)((address&0xff00)>>8);
        addr_tempL = (uint8_t)(address&0x00ff);
        MB_CS_L;
        SPIx_ReadWriteByte(MB85RS2MT_READ_INST);      //读存储器寄存器操作码
        SPIx_ReadWriteByte(addr_tempH);
        SPIx_ReadWriteByte(addr_tempL);
        dat=SPIx_ReadWriteByte(0xAA);               //读取数据,0xAA给予读取数据所需的时钟
        MB_CS_H;
        return (dat);
}

uint8_t shuju=0;
uint8_t fram_process(void)
{
        uint8_t i = 0, result = 0;

//        MB_CS_L;
//       
//        id1[0]=SPIx_ReadWriteByte(0x9F);        //读ID
//        id1[1]=SPIx_ReadWriteByte(0);
//        id1[2]=SPIx_ReadWriteByte(0);
//        id1[3]=SPIx_ReadWriteByte(0);
//        id1[4]=SPIx_ReadWriteByte(0);
//        id1[5]=SPIx_ReadWriteByte(0);               
//       
//  MB_CS_H;
                                               
     MB_CS_L;
     SPIx_ReadWriteByte(0x05);                //读取状态寄存器
     MB_CS_H;
      MB_CS_L;
      SPIx_ReadWriteByte(0x01);                //设置状态寄存器
      SPIx_ReadWriteByte( 0x80 );
      MB_CS_H;
      SPI_write_MB85RS2MT(0x05,10);
      shuju=SPI_read_MB85RS2MT(10);
}


shuju这个变量永远都是0,而不是0x05,我怀疑是写数据操作不成功,但是为什么读出来由是0?不应该是0xff吗?写操作有问题在哪里???
还有,SPIx_ReadWriteByte( 0x80 );有何用意?手册里找不到这个意思?望用过的大神指教。。。。。




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

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2017-8-23
在线时间
45 小时
 楼主| 发表于 2020-11-23 16:22:29 | 显示全部楼层
回复

使用道具 举报

2

主题

582

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2690
金钱
2690
注册时间
2014-5-23
在线时间
188 小时
发表于 2020-11-23 16:43:21 | 显示全部楼层
多研究芯片数据手册,所有时序按照手册的来,还有其他管脚配置电平确保正确
回复

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2017-8-23
在线时间
45 小时
 楼主| 发表于 2020-11-23 16:56:38 | 显示全部楼层
awsawzj 发表于 2020-11-23 16:43
多研究芯片数据手册,所有时序按照手册的来,还有其他管脚配置电平确保正确

使用硬件SPI不需要考虑SPI时序了,而且ID能读取到可以确认通信没问题
回复

使用道具 举报

2

主题

582

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2690
金钱
2690
注册时间
2014-5-23
在线时间
188 小时
发表于 2020-11-25 11:47:52 | 显示全部楼层
枫影06 发表于 2020-11-23 16:56
使用硬件SPI不需要考虑SPI时序了,而且ID能读取到可以确认通信没问题

芯片的读写数据都是有时序要求的
回复

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2020-8-5
在线时间
30 小时
发表于 2021-1-9 19:57:59 | 显示全部楼层
找到原因了吗,最近也在用这个,spi模拟,可是总是读不出来,可以分享下经验吗
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2021-9-28
在线时间
2 小时
发表于 2021-9-28 11:41:11 | 显示全部楼层
吉双章 发表于 2021-1-9 19:57
找到原因了吗,最近也在用这个,spi模拟,可是总是读不出来,可以分享下经验吗

你好,最近解决了吗,我也是遇到了这个问题
回复

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2020-8-5
在线时间
30 小时
发表于 2021-12-21 11:08:57 | 显示全部楼层
liyiaaa 发表于 2021-9-28 11:41
你好,最近解决了吗,我也是遇到了这个问题

解决了,好长时间没登录,程序都忘了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 17:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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