任道游 发表于 2018-1-12 14:56:29

STM32VCT6的SPI3通信

void Spi_Configuration(void)
{
        SPI_InitTypeDefSPI_InitStructure;
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平或者低电平
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //数据捕获于第二个时钟沿
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为16
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
        SPI_Init(SPI3, &SPI_InitStructure);//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
        SPI_Cmd(SPI3, ENABLE); //使能SPI外设

        SPI3_ReadWriteByte(0xff);//启动传输       
       
}

IO初始化
        RCC->APB2ENR |= 0x00000001;//禁用JTAG,开启SWD
        AFIO->MAPR = (0x00FFFFFF & AFIO->MAPR)|0x02000000;

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOB, &GPIO_InitStructure);       //MISO
        GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_5);//PB3/4/5上拉

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

开启时钟
//下面是给各模块开启时钟
//启动GPIO ,AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO , ENABLE);
//SPI3时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);

我通过SPI与F-RAM通信只能看见发送的波形,看不到接收的波形,正常情况下主机控制时序,那么当主机发送完指令后,时钟信号在接收过程中是显示还是不显示,是只有接收到数据才有时钟信号吗?F-RAM是在上升沿读取数据的,现在就是接收不到数据,我用这几个引脚进行模拟SPI通信时可以的,发送的,正常通信的数据的时钟比不正常的慢了半个周期???

MrJiu 发表于 2018-1-12 15:34:27

MCU作为主SPI?有波形出来,然后从机没有波形发输出来?看一下SPI的时序是否都得上从机的。。。然后就是从机是否工作等等!!!

toofree 发表于 2018-1-28 13:53:49

不知道对不对啊,反正在STM32F10X的固件库中,SPI的三个IO管脚都是设置的GPIO_Mode_AF_PP模式,片选信号为GPIO_Mode_Out_PP模式。




页: [1]
查看完整版本: STM32VCT6的SPI3通信