OpenEdv-开源电子网

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

SPI 主机模式 模拟SSI时序,只读,编码器数据 !求助!

[复制链接]

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
发表于 2017-11-21 22:27:24 | 显示全部楼层 |阅读模式
1金钱
F767芯片,SPI2接口。配置:主机模式。需求:只要求读取SSI通信格式编码器的数据,编码器从设备。主机提供CLK时钟。
SSI时序,编码器分辨率:12bit,空闲高,第二个边沿捕获,下面初始化已经按照SSI时序配置。
SPI2初始化:
void SPI2_Init(void)
{         
        u16 tempreg=0;
        RCC->AHB1ENR|=1<<1;                //使能PORTB时钟
        RCC->APB1ENR|=1<<14;           //SPI2时钟使能
        GPIO_Set(GPIOB,7<<13,CFG_MODE_AF,CFG_OTYPE_PP,CFG_SPEED_100M,CFG_PUPD_PU);        //PB13~15复用功能输出       
          GPIO_AF_Set(GPIOB,13,5);//PB13,AF5      //CLK
        GPIO_AF_Set(GPIOB,14,5);//PB14,AF5                //MOSI       
        GPIO_AF_Set(GPIOB,15,5);//PB15,AF5                 //MISO

        //这里只针对SPI口初始化
        RCC->APB1RSTR|=1<<14;        //复位SPI2
        RCC->APB1RSTR&=~(1<<14);//停止复位SPI2
       
        SPI2->CR2=0xB<<8;                          //12位数据格式
        SPI2->CR2|=0x0<<4;                //摩托罗拉模式
        SPI2->CR2|=0x1<<12;                //FIFO占用超1字节,即产生RXNE事件(必须正确设置)

        SPI2->CR1|=0x2<<14;                        //单线,双向,只接收
        SPI2->CR1|=0x1<<10;                        //单工只接收  和14      15bit  配置是否冲突?
        SPI2->CR1|=0x1<<9;                        //软件nss管理
        SPI2->CR1|=0x1<<8;                         
        SPI2->CR1|=0x1<<2;                        //MSRT主机   
        SPI2->CR1|=0x1<<1;                        //空闲模式下SCK为1 CPOL=1
        SPI2->CR1|=0x1<<0;                        //数据采样从第2个时间边沿开始,CPHA=1  

        SPI2->CR1|=0x7<<3;                        //Fsck=Fpclk1/256
        SPI2->CR1|=0x0<<7;                        //MSB First  
        SPI2->CR1|=0x1<<6;                        //SPI使能外设启动

        SPI2->I2SCFGR&=~(1<<11);//选择SPI模式       
}

接收发送函数:
u8 SPI2_ReadWriteByte(u8 TxData)
{                           
        vu32 *data_reg=&SPI2->DR;               
        while((SPI2->SR&1<<1)==0);               
                *(vu8 *)data_reg=TxData;               
        while((SPI2->SR&1<<0)==0);               
        return *(vu8 *)data_reg;               
}


int main()
{
        //各种初始化
        u8 SPI_8bit = 0;
        while(1)
       {
               CSN_Ctrl(0);          //片选拉低
               SPI_8bit = SPI2_ReadWriteByte(0xFF);
               printf("SPI = %x \n",SPI_8bit);
               CSN_Ctrl(1);          // 片选拉高
       }
}

注:767为主机,只接收即可,不需要发送数据。编码器为从机,只为主机提供12bit分辨率的数据。
问题:
1.send函数。是否需要写满32bit   每次8bit,4次写满32bit 到DR寄存器,然后在发送,等待,最后接收数据?因为编码器是12bit的分辨率,我该怎么接收?返回值是u8,我是否应该设置成u16的 然后取12bit即可?
2.打印出来的数据 是:0XFFFF,没有任何变动,说明获取数据错误,通信是否成功?
3.主机F767 只接收,写操作没有影响,从机编码器,根据主机CLK时钟,通过SSI通信格式将12bit 的数据只发送给F767 。
模式:主机-------只读即可
          从机-------只发送即可


请大神帮我看一下 哪里有问题!!!???我实在是弄不出来了。麻烦各位大神了!!!





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

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
 楼主| 发表于 2017-11-21 22:28:55 | 显示全部楼层
@正点原子 原子哥我还得麻烦您一下!帮我看一下,十分麻烦您了!您还需要什么数据 然后说出来我在告诉您,我这边已经几天没有进展了!麻烦您帮我看一下!谢谢!!!
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
 楼主| 发表于 2017-11-21 22:29:06 | 显示全部楼层
恳请大家帮帮忙!!!!谢谢!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-22 00:57:56 | 显示全部楼层
1,12位分辨率,那就分2次接收,然后丢弃6位数据即可。  2,先用软件模拟的方式,先测试下看看能否正常读数据。    3,767我只用过主模式,建议你也可以用主模式,不用MOSI线即可,然后写DR即可产生时钟。从而接收数据。
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
 楼主| 发表于 2017-11-22 09:20:24 | 显示全部楼层
正点原子 发表于 2017-11-22 00:57
1,12位分辨率,那就分2次接收,然后丢弃6位数据即可。  2,先用软件模拟的方式,先测试下看看能否正常读数 ...

767用的就是主模式!编码器是从模式!用的是MISO  单线链接+ CLK 时钟线。写DR是写8bit之后等待为空,然后直接返回 DR还是 写满32bit在读取返回值?

12分辨率,丢弃6位数据是怎么理解的?我有点没明白。分两次接收,那每次接收8bit 两次就是16bit 丢弃4bit???

软件测试过,逻辑分析仪检测过,主模式,只发送没问题。然后现在改成,主模式 只读取,接不好用了、

麻烦您看一下 函数 有些地方若不对或者需要加以改进,麻烦您指出来!!万分感谢!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-23 01:31:43 | 显示全部楼层
1, 一般是读4次,组合成32位。
2,读2次拼成16位,丢弃4位,那就是12位了。很好理解了。
3,要我做会用主模式,不用MOSI引脚即可(不初始化为复用输出)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
 楼主| 发表于 2017-11-23 21:37:39 | 显示全部楼层
@正点原子 原子哥,我用的就是主模式。。配的MISO引脚。。。然后我的初始化应该没错吧?但是数据始终 不出现 我要哭了
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
 楼主| 发表于 2017-11-27 09:49:15 | 显示全部楼层
还有人么
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 09:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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