中级会员
 
- 积分
- 359
- 金钱
- 359
- 注册时间
- 2018-9-29
- 在线时间
- 146 小时
|
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时序
|