OpenEdv-开源电子网

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

STM32F103 SPI通讯读取磁编码器 数值一直是FF

[复制链接]

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
发表于 2020-4-6 13:33:49 | 显示全部楼层 |阅读模式
1金钱
oid SPI1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );//PORTB时钟使能
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_SPI1,  ENABLE );//SPI1时钟使能        
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );
       
       
        /* 配置SPI的 SCK引脚GPIO_Pin_5  配置SPI的 MISO引脚GPIO_Pin_6   配置SPI的 MOSI引脚GPIO_Pin_7*/
         /* 配置SPI的 CS引脚,普通IO即可 */
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  //SPI_NSS
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //输出模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_SetBits(GPIOA,GPIO_Pin_4);
       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                //SPI_SCK
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;                //SPI_MISO
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;        //SPI_MOSI
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        SPI_Cmd(SPI1, DISABLE);         //必须先禁用,才能改变MODE
        SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex; //两线全双工
        SPI_InitStructure.SPI_Mode =SPI_Mode_Master; //主
        SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b; //8位
        SPI_InitStructure.SPI_CPOL =SPI_CPOL_High; //CPOL=0
        SPI_InitStructure.SPI_CPHA =SPI_CPHA_2Edge; //CPHA=0
        SPI_InitStructure.SPI_NSS =SPI_NSS_Soft; //软件NSS
        SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_256; //64分频
        SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB; //高位在前
        SPI_InitStructure.SPI_CRCPolynomial =7; //CRC7
        SPI_Init(SPI1,&SPI_InitStructure);
       
        SPI_Cmd(SPI1, ENABLE);                        //打开SPI

}   
u32 SPI_SDAD_transmission_Fun ( void)
{       
        u32 Temp = 0 , Temp1 = 0, Temp2 = 0 , Temp3 = 0 , Temp4 = 0,Temp5 = 0 , Temp6 = 0;;
       
               
        ACTIVATE_FUN();//激活发送指令磁编码器
  /* 开始通讯:CS低电平 */
   SPI_IC_MU_CS_LOW();
        //delay_us(10);
        Temp = SPI1_ReadWriteByte(SDAD_transmission);//SDAD_transmission
       
        Temp1=SPI1_ReadWriteByte(Dummy_Byte);
        Temp2=SPI1_ReadWriteByte(Dummy_Byte);
        Temp3=SPI1_ReadWriteByte(Dummy_Byte);
        Temp4=SPI1_ReadWriteByte(Dummy_Byte);
        //delay_us(10);
        //Temp5 = SPI1_ReadWriteByte(0xff);//启动传输       
         /* 结束通讯:CS高电平*/

     SPI_IC_MU_CS_HIGH();
       
   Temp = ((Temp1 << 16) | (Temp2 << 8) | Temp3  )>> 5 ; //读出数据,右移5位,共24位,有效位为19位
         
         return Temp;
}
//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{               
        u8 retry=0;                                        
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
                {
                retry++;
                if(retry>200)return 0;
                }                          
        SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
        retry=0;

        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
                {
                retry++;
                if(retry>200)return 0;
                }       
  SPI_I2S_ReceiveData(SPI1)                ;                            
        return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据                                            
}

void ACTIVATE_FUN(void)
{
  u16 Temp = 0,  Temp1 = 0 , Temp2 = 0 ;
  SPI_IC_MU_CS_LOW();

  SPI1_ReadWriteByte(ACTIVATE);
       
        SPI1_ReadWriteByte(0X83);    //激活PACTIVE和RACTIVE
       
       
       
  SPI_IC_MU_CS_HIGH();

}相关程序 求大佬帮忙看看哪里错了



磁编码器的 SPI时序

磁编码器的 SPI时序

最佳答案

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

解决了 程序没问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-6 13:33:50 | 显示全部楼层
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-6 13:35:24 | 显示全部楼层
求帮忙看看啊 已经三天了 读出来的数据一直是FF 我甚至怀疑这磁编码器 是坏的
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-6 13:37:45 | 显示全部楼层
顶一下
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-6 13:52:07 | 显示全部楼层
就这么凉凉了吗?
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-6 13:57:25 | 显示全部楼层
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-6 15:31:43 | 显示全部楼层
啊啊a啊啊啊啊啊啊啊啊啊a
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-4-7 00:56:40 | 显示全部楼层
继续努力,我也没用过你这种编码器, 爱莫能助
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-4-7
在线时间
3 小时
发表于 2020-4-7 09:24:56 | 显示全部楼层
本帖最后由 linhaigood999 于 2020-4-7 09:27 编辑

试试用proteus 8 模拟器 分析一下时序
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2020-2-27
在线时间
26 小时
发表于 2020-4-7 09:36:00 | 显示全部楼层
编码器没型号,参考资料都没有,别人无法帮助你啊。
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-4-7 10:14:14 | 显示全部楼层
SPI_CPOL_High   SPI_CPHA_2Edge 的排列组合都试试  感觉mode0应该是  low  1edge
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-7 10:16:49 | 显示全部楼层
nashui_sx 发表于 2020-4-7 10:14
SPI_CPOL_High   SPI_CPHA_2Edge 的排列组合都试试  感觉mode0应该是  low  1edge

支持MODE0 和MODE3  两种我都试过 回复的都是0XFF  会不会是板子有问题?
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-7 10:18:30 | 显示全部楼层
磁编码器的说明书
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-7 10:19:35 | 显示全部楼层
说明书 已上传

IC-MU.pdf

2.41 MB, 下载次数: 21

回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-4-7 10:19:43 | 显示全部楼层
我有偏见 发表于 2020-4-7 10:16
支持MODE0 和MODE3  两种我都试过 回复的都是0XFF  会不会是板子有问题?

有可能  可能性不大吧,上传编码器的文档吧  不然谁能知道啥问题   那俩排列组合有4种 还需要配合cs引脚 都试了?
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-7 10:20:02 | 显示全部楼层
@正点原子
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-4-19
在线时间
3 小时
发表于 2020-4-19 22:06:13 | 显示全部楼层
兄弟解决了吗,我最近也在研究类似的芯片,也遇到同样的问题,请教一下@我有偏见
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-4-19
在线时间
3 小时
发表于 2020-4-19 22:18:32 | 显示全部楼层
楼主解决了吗?遇到相同问题,求探讨求答案@我有偏见
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-4-19
在线时间
3 小时
发表于 2020-4-20 09:03:30 | 显示全部楼层
楼主怎么解决这个问题的?
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-4-19
在线时间
3 小时
发表于 2020-4-20 09:04:45 | 显示全部楼层
我现在用类似的芯片,STM32F4驱动,MISO也是一直是FF,百思不得其解,求问楼主解决了吗?原因在哪
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-4-19
在线时间
3 小时
发表于 2020-4-20 09:05:11 | 显示全部楼层
@我有偏见
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2018-9-29
在线时间
146 小时
 楼主| 发表于 2020-4-29 14:14:30 | 显示全部楼层

你好 解决了 原因的硬件问题 不是软件问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-27 04:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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