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没有输出
没用过 直接操作寄存器程序可读性不佳啊。。 在 ST Visual Programmer 选择相应的复用功能即可 ts2000 发表于 2015-5-28 08:20
在 ST Visual Programmer 选择相应的复用功能即可
STM8S系列里确实有,可以在STVP里设置,但是STM8L其他的我不知道,但是STM8L051的没有可以设置的选项 也碰到这问题,LZ解决了没? 时钟跑得起来否?
还有,SPI外设的时钟要手动开启的哦,默认是关闭的。 我操作的是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]