IO口模拟SPI求助,毕业设计急用!
小弟的邮箱zhaoshuyehit@126.com,望帮忙!1
#include "common.h"
_Bool MOSI @PA_ODR : 1; /* 5; */
_Bool MISO @PD_IDR : 2; /* 2; */
_Bool SCK @PC_ODR : 7; /* 3; */
_Bool CSS @PC_ODR : 6; /* 4; */
/** @fn : spi_sim_configuration(void)
* @brief :spi引脚配置函数
* @param : None
* @return : None
*/
void spi_sim_configuration(void)
{
PA_DDR |= BIT1;
PA_CR1 |= BIT1;
PA_CR2 &= ~(BIT1);
PA_ODR &= ~BIT1;
PD_DDR &= ~BIT2;
PD_CR1 &= ~BIT2;
PD_CR2 &= ~(BIT2);
PD_ODR &= ~BIT2;
PC_DDR |= BIT7;
PC_CR1 |= BIT7;
PC_CR2 &= ~(BIT7);
PC_ODR &= ~BIT7;
PC_DDR |= BIT6;
PC_CR1 |= BIT6;
PC_CR2 &= ~(BIT6);
PC_ODR |= BIT6;
}
/** @fn : spi_delay(void)
* @brief :频率延时函数
* @param : None
* @return : None
*/
void spi_delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/** @fn : spi_write_read_word(u16 dat)
* @brief : 读写双字节函数
* @param : 发送的数据
* @return : 读取的数据
*/
u16 spi_write_read_word(u16 wData)
{
u8 i;
u16 wTemp = 0;
SCK = 0;
for (i = 0; i < 16; i++)
{
if (wData & 0x8000)
{
MOSI = 1;
}
else
{
MOSI = 0;
}
spi_delay();
wData <<= 1;
SCK = 1;
spi_delay();
wTemp <<= 1;
if (MISO)
{
wTemp++;
}
SCK = 0;
}
return wTemp;
}
/** @fn : spi_send_12bit_adress(u16 wAddress,u16 wDir)
* @brief : spi地址发送函数
* @param : wAddress 寄存器地址
wDir 读写方向
* @return : NONE
*/
void spi_send_12bit_adress(u16 wAddress,u16 wDir)
{
if(wDir==SPI_DR_R)
{
wAddress |= SPI_DR_R;
}
else
{
wAddress &= SPI_DR_W;
}
spi_write_read_word(wAddress);
}
/** @fn : spi_reg_read(u16 wRegAddr)
* @brief : spi读寄存器函数
* @param : wAddress 寄存器地址
* @return : 读取的数据
*/
u16 spi_reg_read(u16 wRegAddr)
{
u16 wReadData = 0;
CS_LOW();
spi_send_12bit_adress(wRegAddr,SPI_DR_R);
spi_delay();
spi_delay();
spi_delay();
spi_delay();
wReadData = spi_write_read_word(VD_ST_DUM);
CS_HIG();
return wReadData;
}
