|
#include
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "stm32f10x_spi.h"
//2012.12.5開始 12.10 stm32正常
void SPI2init()
{
RCC->APB2ENR|=0x00000028;//使能時鐘GPIOB,D時鐘
RCC->APB1ENR|=1<<14;//使能SPI2口時鐘
GPIOB->CRH&=0x000FFFFF; //PB13,14,15初始給高電平
GPIOB->CRH|=0xBBB00000; //
GPIOB->ODR|=0x0000E000;//初始為高電平
GPIOB->CRH&=0x000FFFFF; //PB13,14,15復用 50HZ 推挽輸出
GPIOB->CRH|=0xBBB00000;
SPI2->CR1=0x0000;//全部清零
/*SPI2->CR1|=0x023E;//選擇STM32為主設備,256分頻,從第1個跳變開始采樣,SCK空閑時為高電平,nss軟件管理, 16bit讀寫
SPI2->CR1&=0<<8;
SPI2->CR1|=0x0040;//SPI使能*/
SPI2->CR1|=0<<10;//全雙工模式
SPI2->CR1|=1<<9; //軟件nss管理
SPI2->CR1|=1<<8;
SPI2->CR1|=1<<2; //SPI主機
SPI2->CR1|=0<<11;//8bit數據格式
SPI2->CR1|=1<<1; //空閑模式下SCK為1 CPOL=1
SPI2->CR1|=1<<0; //數據采樣從第二個時間邊沿開始,CPHA=1
SPI2->CR1|=7<<3; //Fsck=Fcpu/256
SPI2->CR1|=0<<7; //MSBfirst
SPI2->CR1|=1<<6; //SPI設備使能
}
void SPI1init()
{
RCC->APB2ENR|=0x00001004;//使能SPI1時鐘,GPIOA時鐘
GPIOA->CRL&=0x000fffff;
GPIOA->CRL|=0xBBB000000;
SPI1->CR1=0x0000;//全部清零
SPI1->CR1|=1<<9;//nss軟件管理
SPI1->CR1|=0<<8;//nss置位
SPI1->CR1|=1<<1; //空閑模式下SCK為1 CPOL=1
SPI1->CR1|=1<<0; //數據采樣從第二個時間邊沿開始,CPHA=1
SPI1->CR1|=0<<11;//8bit數據格式
SPI1->CR1|=0<<2; //SPI從機
SPI1->CR1|=0<<7; //MSBfirst
SPI1->CR1|=1<<6;//使能
}
u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while((SPI2->SR&1<<1)==0)//等待發送區空
{
retry++;
if(retry>200)return 0;
}
SPI2->DR=0xff; //發送一個byte
retry=0;
while((SPI2->SR&1<<0)==0) //等待接收完一個byte
{
retry++;
if(retry>200)return 0;
}
return SPI2->DR; //返回收到的數據
}
u8 SPI1_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while((SPI1->SR&1<<1)==0)//等待發送區空
{
retry++;
if(retry>200)return 0;
}
SPI1->DR=(u16)TxData; //發送一個byte
retry=0;
while((SPI1->SR&1<<0)==0) //等待接收完一個byte
{
retry++;
if(retry>200)return 0;
}
return SPI1->DR; //返回收到的數據
}
int main(void)
{
u8 test=0;
Stm32_Clock_Init(9);//系統時鐘設置
delay_init(72); //延時初始化
SPI2init();
SPI1init();
while(test==0)
{
SPI2_ReadWriteByte(0xff);
test=SPI1_ReadWriteByte(0x00);
delay_ms(10);
}
}
我把兩個SPI直接連接在了一起,結果發現收到的死活都是test==0,不知道哪里錯了,希望各位斧正
|
|