初级会员

- 积分
- 86
- 金钱
- 86
- 注册时间
- 2017-4-15
- 在线时间
- 12 小时
|
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 。
模式:主机-------只读即可
从机-------只发送即可
请大神帮我看一下 哪里有问题!!!???我实在是弄不出来了。麻烦各位大神了!!!
|
|