风-417456 发表于 2015-5-27 10:19:28

STM8l051复用SPI功能需要怎么操作

void SPI_Initial( void )
{
        //Set as default
        SPI_DeInit( );
        //Set the priority of the SPI
        SPI_Init();
      //Config the GPIOs for SPI bus
        SPI_GPIO_Init();
}

void SPI_DeInit(void)
{
        SPI1_CR1 = 0x00;       
        SPI1_CR2 = 0x00;
        SPI1_ICR = 0x00;
        SPI1_SR = 0x02;
}

void SPI_Init(void)
{
        SYSCFG_RMPCR1 |= 0x80;        //选择复用SPI接口为PA2,PA3,PC5
       
        SPI1_CR1 = 0x00;        //先发送MSB,波特率000,SCK空闲为低,数据采样第一个时钟边沿开始       
        SPI1_CR2 = 0x03;       
        SPI1_CR1 |= 0x40;        //启动SPI总线
        SPI1_CRCPR = 0x07;
       
        SPI1_CR1 |= 0x40;
}

void SPI_GPIO_Init(void)
{
        PA_DDR |= ~(1<<MISO);
        PA_CR1 |= ~(1<<MISO);
        PA_CR2 |= ~(1<<MISO);        //设置PA2,复用MISO时为悬浮输入
       
        PA_DDR |= (1<<MOSI);
        PA_CR1 |= (1<<MOSI);
        PA_CR2 |= (1<<MOSI);        //设置PA3,复用MOSI时为推挽输出
       
        PC_DDR |= (1<<SCK);
        PC_CR1 |= (1<<SCK);
        PC_CR2 |= (1<<SCK);        //设置PC6,复用SCK时为推挽输出
       
        PC_DDR |= (1<<CSN);
        PC_CR1 |= (1<<CSN);
        PC_CR2 |= (1<<CSN);        //设置PC5,复用CSN时为推挽输出
}
#define MISO 2
#define MOSI 3
#define SCK 6
#define CSN 5

以上是我初始化SPI的程序,参考了官方的例程修改的,但是调试一直通不过,SPI没有输出

你好我好大家好! 发表于 2015-5-27 10:42:19

没用过      

艴小鱼 发表于 2015-5-27 11:42:29

直接操作寄存器程序可读性不佳啊。。

ts2000 发表于 2015-5-28 08:20:32

在 ST Visual Programmer 选择相应的复用功能即可

风-417456 发表于 2015-5-28 13:41:00

ts2000 发表于 2015-5-28 08:20
在 ST Visual Programmer 选择相应的复用功能即可

STM8S系列里确实有,可以在STVP里设置,但是STM8L其他的我不知道,但是STM8L051的没有可以设置的选项

黑夜之狼 发表于 2016-1-11 01:15:53

也碰到这问题,LZ解决了没?

xmshao 发表于 2016-1-11 13:24:04

时钟跑得起来否?

还有,SPI外设的时钟要手动开启的哦,默认是关闭的。

lmy11224433 发表于 2018-3-2 15:32:16

我操作的是RC522,while里面一直进行写操作但是也没有SCK时钟,以下是我的初始化操作,有好心人给看一下吗?也帮楼主顶一下!
CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);
    GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Fast); //NSS片选
    GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast); //SCK
    GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast); //MOSI
    //主机模式,配置为输入
    GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); //MISO
   
    BSP1_RFID_PowerOn();      //给RC522芯片上电
    //BSP1_RFID_PowerOff();
   
    SPI_DeInit(SPI1);
    SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_8, SPI_Mode_Master,SPI_CPOL_Low, SPI_CPHA_1Edge,SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);
    //SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_128, SPI_Mode_Master,SPI_CPOL_High, SPI_CPHA_2Edge,SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);
    SPI_Cmd(SPI1, ENABLE);/* 使能SPI */
   
    rv = BSP1_RFID_Reset(&ctrl_reg, &ver_reg);//和PcdReset库函数一模一样
    printf("ctrl_reg:%02X, ver_reg:%02X\r\n", ctrl_reg, ver_reg);
    if (rv != 0)
    {
      printf("rfid init error\r\n");
    }
    BSP_RFID_AntennaOff();
    delay_ms(1);
    BSP_RFID_AntennaOn();
    BSP_RFID_ConfigISOType('A');      //针对ISO14443A型卡进行初始化
页: [1]
查看完整版本: STM8l051复用SPI功能需要怎么操作