#include "spi.h"
|
#include "gpio.h"
|
|
void SPI3_Init(void)
|
{
|
CMU_PERCLK_SetableEx(PADCLK, ENABLE); //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
|
|
// AltFunIO(GPIOF, GPIO_Pin_15, ALTFUN_NORMAL); // SSN
|
|
|
AltFunIO(SPI3_PORT, SPI3_SCK_PIN, ALTFUN_NORMAL); // SCK
|
AltFunIO(SPI3_PORT, SPI3_MISO_PIN, ALTFUN_NORMAL); // MISO
|
AltFunIO(SPI3_PORT, SPI3_MOSI_PIN, ALTFUN_NORMAL); // MOSI
|
|
CMU_PERCLK_SetableEx(SPI3CLK, ENABLE); //¿ªÆôSPI3×ÜÏßʱÖÓ
|
|
SPIx_CR1_IOSWAP_Set(SPI3, SPIx_CR1_IOSWAP_DEFAULT); // MISO¡¢MOSIĬÈÏÒý½Å ²»½»»»
|
SPIx_CR1_MM_Set(SPI3, SPIx_CR1_MM_MASTER); //masterģʽ
|
SPIx_CR1_WAIT_Set(SPI3, SPIx_CR1_WAIT_1WAIT); // ÿ·¢ËÍÍêÒ»Ö¡ºó²åÈëÒ»¸öCLK
|
SPIx_CR1_BAUD_Set(SPI3, SPIx_CR1_BAUD_DIV4); //²¨ÌØÂÊÉèÖÃΪÍâÉèʱÖÓ2·ÖƵ
|
SPIx_CR1_LSBF_Set(SPI3, SPIx_CR1_LSBF_MSB); //Ö¡¸ñʽÏÈ·¢ËÍMSB
|
SPIx_CR1_CPHOL_Set(SPI3, SPIx_CR1_CPHOL_LOW); //CLKÍ£Ö¹ÔÚµÍµçÆ½
|
SPIx_CR1_CPHA_Set(SPI3, SPIx_CR1_CPHA_1CLOCK); //µÚÒ»¸öʱÖÓ±ßÑØ²¶×½
|
SPIx_CR2_SSNSEN_Setable(SPI3, DISABLE); //SSNÓÉÓ²¼þ¿ØÖÆ
|
|
SPIx_CR2_RXO_Setable(SPI3, DISABLE); //SPIÉèÖÃΪȫ˫¹¤
|
SPIx_CR2_DLEN_Set(SPI3, SPIx_CR2_DLEN_8BIT); //ͨÐÅÊý¾Ý×Ö³¤8bit
|
SPIx_CR2_HALFDUPLEX_Set(SPI3, SPIx_CR2_HALFDUPLEX_SPI); //SPIÉèÖÃΪ±ê×¼SPIģʽ
|
SPIx_CR2_SSNM_Set(SPI3, SPIx_CR2_SSNM_LOW); //ÿ´Î·¢Íêmasterºóssn±£³ÖµÍ
|
SPIx_CR2_TXO_AC_Setable(SPI3, DISABLE); //¹Ø±ÕTXONLY×Ô¶¯Çå0
|
SPIx_CR2_TXO_Setable(SPI3, DISABLE); //¹Ø±ÕTXONLYģʽ
|
// SPIx_CR2_SSN_Set(SPI3, SPIx_CR2_SSN_HIGH); //SSNSENΪ£±Ê±SNNÊä³ö¸ßµçƽ
|
|
SPIx_CR3_SERRC_Clr(SPI3); //Çå³ý´Ó»ú´íÎó±êÖ¾
|
SPIx_CR3_MERRC_Clr(SPI3); //Çå³ýÖ÷»ú´íÎó±êÖ¾
|
SPIx_CR3_RXBFC_Clr(SPI3); //Çå³ýRXBUF
|
SPIx_CR3_TXBFC_Clr(SPI3); //Çå³ýTXBUF
|
|
SPIx_CR2_SPIEN_Setable(SPI3, ENABLE); //ʹÄÜSPI3
|
}
|
|
|
void SPI3_sleep(void)
|
{
|
CMU_PERCLK_SetableEx(SPI3CLK, DISABLE); //¿ªÆôSPI3×ÜÏßʱÖÓ
|
|
SPIx_CR2_SPIEN_Setable(SPI3, DISABLE); //ʧÄÜSPI3
|
|
CloseIO(SPI3_PORT, SPI3_SCK_PIN); // SCK
|
CloseIO(SPI3_PORT, SPI3_MISO_PIN); // MISO
|
CloseIO(SPI3_PORT, SPI3_MOSI_PIN); // MOSI
|
}
|
|
uint8_t SpiWriteAndRead(uint32_t data)
|
{
|
SPIx_TXBUF_Write(SPI3, data);
|
while (!SPIx_ISR_TXBE_Chk(SPI3));
|
while (!SPIx_ISR_RXBF_Chk(SPI3));
|
data = SPIx_RXBUF_Read(SPI3);
|
|
return data;
|
}
|
|
void SpiWrite(uint8_t *data, uint32_t length)
|
{
|
while (length--)
|
{
|
SpiWriteAndRead(*data);
|
data++;
|
}
|
}
|
|
void SpiRead(uint8_t *data, uint32_t length)
|
{
|
while (length--)
|
{
|
*data = SpiWriteAndRead(0x00);
|
data++;
|
}
|
}
|