void SPI_MasterInit(void)
{
/* 设置MOSI 和SCK 为输出,其薯李漏他为输入 */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)
/* 使能SPI 主机模式,设置时钟速率为fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)
}
void SPI_MasterTransmit(char cData)
{
/* 启动数据传输 */
SPDR = cData
/* 等待传输结束 */
while(!(SPSR &(1<<SPIF)))
}
void SPI_SlaveInit(void)
{
/* 设置MISO 为输出,其他为输入 */
DDR_SPI = (1<<DD_MISO)
/* 使能 SPI */
SPCR = (1<<SPE)
}
char SPI_SlaveReceive(void)
{
/* 等待接收结束 */
while(!(SPSR &(1<<SPIF)))
/* 返回数据 */
return SPDR
}
void SPI_Config(void){
GPIO_InitTypeDef GPIO_InitStructure
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5 | GPIO_Pin_7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL
GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5 | GPIO_Pin_7)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN
GPIO_SetBits(GPIOA,GPIO_Pin_6)
}
void SPI_ByteWr(unsigned char WrData) //spi 写
{
unsigned char i
GPIO_ResetBits(GPIOA,GPIO_Pin_4)
Delay(2)
GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5)
for(i=0i<8i++)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_5)
Delay(2)
if((WrData&0x80) == 0x80)
GPIO_SetBits(GPIOA,GPIO_Pin_7)
else
GPIO_ResetBits(GPIOA,GPIO_Pin_7)
WrData <<= 1
GPIO_SetBits(GPIOA,GPIO_Pin_5)
Delay(2)
}
}
unsigned char SPI_ByteRd(void)//读取一个字节
{
unsigned char i
unsigned char RdData = 0
for(i=0i<8i++)
{
RdData <<= 1
GPIO_ResetBits(GPIOA,GPIO_Pin_5)
Delay(2)
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6))
RdData|=1
GPIO_SetBits(GPIOA,GPIO_Pin_5)
Delay(2)
}
return RdData
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)