#include "spi.h" #include "stm32f10x_gpio.h" #include "stm32f10x_spi.h" #include "stm32f10x.h" #if !defined(SPI_HARD) void RF_SPI_SCK_H(void) { GPIO_WriteBit(RF_SPI_SCK_Port, RF_SPI_SCK_IO, BOARD_PIN_H); } void RF_SPI_SCK_L(void) { GPIO_WriteBit(RF_SPI_SCK_Port, RF_SPI_SCK_IO, BOARD_PIN_L); } void RF_SPI_MISO_H(void) { GPIO_WriteBit(RF_SPI_MISO_Port, RF_SPI_MISO_IO, BOARD_PIN_H); } void RF_SPI_MISO_L(void) { GPIO_WriteBit(RF_SPI_MISO_Port, RF_SPI_MISO_IO, BOARD_PIN_L); } void RF_SPI_MISO_SETMODE(GPIOMode_TypeDef mode) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = RF_SPI_MISO_IO; GPIO_InitStructure.GPIO_Mode = mode; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RF_SPI_MISO_Port, &GPIO_InitStructure); } uint8_t READ_RF_SPI_MISO(void) { return GPIO_ReadInputDataBit(RF_SPI_MISO_Port, RF_SPI_MISO_IO); } #endif void RF_SPI_NSS_H(void) { GPIO_WriteBit(RF_SPI_NSS_Port, RF_SPI_NSS_IO, BOARD_PIN_H); } void RF_SPI_NSS_L(void) { GPIO_WriteBit(RF_SPI_NSS_Port, RF_SPI_NSS_IO, BOARD_PIN_L); } void spi_init(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = RF_SPI_MISO_IO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RF_SPI_MISO_Port, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = RF_SPI_SCK_IO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RF_SPI_SCK_Port, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = RF_SPI_NSS_IO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RF_SPI_NSS_Port, &GPIO_InitStructure); RF_SPI_NSS_H(); } void SpiWrite(uint8_t byteToWrite) { uint8_t i; __set_PRIMASK(1); //全局中断关闭 RF_SPI_MISO_SETMODE(GPIO_Mode_Out_PP); RF_SPI_SCK_L(); for(i=0; i<8; i++) { if(byteToWrite & 0x80) { RF_SPI_MISO_H(); } else { RF_SPI_MISO_L(); } RF_SPI_SCK_H(); byteToWrite <<= 1; RF_SPI_SCK_L(); } __set_PRIMASK(0); //全局中断打开 } uint8_t SpiRead(void) { uint8_t i, temp; temp = 0; __set_PRIMASK(1); //全局中断关闭 RF_SPI_MISO_SETMODE(GPIO_Mode_IN_FLOATING); RF_SPI_SCK_L(); for(i=0; i<8; i++) { temp <<= 1; RF_SPI_SCK_H(); if(READ_RF_SPI_MISO()) { temp ++; } RF_SPI_SCK_L(); } __set_PRIMASK(0); //全局中断打开 return temp; }