打印
[STM32F1]

STM32F103VCT6 的SPI1和74HC595通信,并控制数码管显示

[复制链接]
3119|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kn1986|  楼主 | 2018-4-4 14:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
看相关教程的过程中,自己搭DEMO过程中遇到些问题点,分享出来,给后来者以借鉴…

常用的SPI通讯方式是标准四线制,如下图电路示意图所示:

STM32和74HC595的接线方式为:

SPI1_MOSI引脚(PA7)-----74HC595(pin14 SI)相连接

SPI1_MISO引脚(PA6)不接

SPI1_SCK引脚(PA5)-----74HC595(pin11 SCK)相连接

SPI1_NSS引脚(PA4)----74HC595(pin13 ncs)相连接  选择模式为:SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 并在初始化中打开SPI_NSS脚输出功能:SPI_SSOutputCmd(SPI1, ENABLE);这样SPI1_NSS引脚就可以像操作普通IO口一样,输出低电平来选择74HC595芯片。

软件方面,由于程序比较多,就把GPIO配置、SPI配置、和SPI数据发送等相关程序列出来。

void GPIO_Configuration(void)

{       

        // PA0-595_nCS(输出)  PA1-RCK(输出) PA5-SPI1_SCK(输出)        PA6-SPI1-MISO(输入)        PA7-SPI1_MOSI(输出)

        GPIO_InitTypeDef GPIO_InitStructure;                //声明一个结构体变量

       

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;        //选择PA0 PA1

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50M

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式推挽输出

        GPIO_Init(GPIOA, &GPIO_InitStructure);                                        //按照以上结构体参数值初始化GPIOE寄存器

       

       

        //SmgA1--PC8(输出)       

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;        //选择PC8

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50M

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式为推挽输出

        GPIO_Init(GPIOC, &GPIO_InitStructure);

       

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;        //选择PB15

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50M

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式为推挽输出

        GPIO_Init(GPIOB, &GPIO_InitStructure);

       

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;        //选择PE8

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50M

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式为推挽输出

        GPIO_Init(GPIOE, &GPIO_InitStructure);

       

       

        //SPI所用管脚的初始化

        GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5|GPIO_Pin_7;        //选择PA.5,PA.7

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                        //管脚频率为50MHZ

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //模式为复用推挽输出 (SPI1)

        GPIO_Init(GPIOA, &GPIO_InitStructure);                           //初始化GPIOA寄存器

       

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                                        //选择PA6

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//输入模式为浮空输入

        GPIO_Init(GPIOA, &GPIO_InitStructure);

       

        GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4;        //选择PA.4

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                        //管脚频率为50MHZ

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出模式 (SPI1)

        GPIO_Init(GPIOA, &GPIO_InitStructure);

       

}

void SPI_Configuration(void)

        {

                /* SPI1 configuration */

                        SPI_InitTypeDef  SPI_InitStructure;

                        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_Low;//SPI_CPOL_High=模式3,时钟空闲为高 //SPI_CPOL_Low=模式0,时钟空闲为低

                        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//SPI_CPHA_2Edge;//SPI_CPHA_1Edge, SPI_CPHA_2Edge;

                        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//SPI_NSS_Soft;//SPI_NSS_Hard

                        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//SPI_BaudRatePrescaler_2=18M;//SPI_BaudRatePrescaler_4=9MHz

                        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;//数据从高位开始发送

                        SPI_InitStructure.SPI_CRCPolynomial = 7;

                       

                        SPI_Init(SPI1, &SPI_InitStructure);

                                /*Enable SPI1.NSS as a GPIO*/

                        SPI_SSOutputCmd(SPI1, ENABLE);


                        /* Enable SPI1  */

                        SPI_Cmd(SPI1, ENABLE);

               

        }

GPIO_ResetBits(GPIOA, GPIO_Pin_4);


//--------数码管的控制--------------

while(1)

        {

//                 i=3;

//                 for(;i<10;)

                        for(i=0;i<10;i++)

                {


                 SPI_I2S_SendData(SPI1,tab);

//                 i++;

                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);               

                GPIO_ResetBits(GPIOA, GPIO_Pin_1);

                Delay(10);       

                GPIO_SetBits(GPIOA, GPIO_Pin_1);

                Delay(10);       

                Delay(1000);

               

                        }

               

        }


74HC595.png (51.8 KB )

74HC595与数码管连接

74HC595与数码管连接

STM32F103VCT6_SPI.png (68.4 KB )

STM32F103VCT6的SPI口

STM32F103VCT6的SPI口

74HC595.png (51.8 KB )

74HC595与数码管连接

74HC595与数码管连接
评论
74HC985 2018-6-10 00:47 回复TA
能运行成功?? 
沙发
mmuuss586| | 2018-4-4 15:12 | 只看该作者
感谢楼主分享;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝