#include "spi.h"
#include "string.h"
#define CS_DELAY 35
#define _FM11_Sel() {GPIO_ResetBits(FM11_CS,FM11_Pin_CS);}//拉低电平
#define _FM11_DeSel() {GPIO_SetBits(FM11_CS,FM11_Pin_CS);}//拉高电平
void FM11_InitPort(void)
{
GPIO_Init(FM11_SCK , FM11_Pin_SCK, GPIO_Mode_Out_PP_High_Fast);
GPIO_Init(FM11_MOSI , FM11_Pin_MOSI, GPIO_Mode_Out_PP_High_Fast);
GPIO_Init(FM11_MISO , FM11_Pin_MISO, GPIO_Mode_In_PU_No_IT);
CLK_PeripheralClockConfig(CLK_Peripheral_SPI1,ENABLE);
GPIO_ExternalPullUpConfig(FM11_MISO , FM11_Pin_MISO,ENABLE);
SPI_Init(SPI1,SPI_FirstBit_MSB,SPI_BaudRatePrescaler_16,SPI_Mode_Master,SPI_CPOL_Low,SPI_CPHA_2Edge,SPI_Direction_2Lines_FullDuplex,SPI_NSS_Soft,0x07);
SPI_Cmd(SPI1,ENABLE);
GPIO_Init(FM11_CS , FM11_Pin_CS, GPIO_Mode_Out_PP_High_Fast);
_FM11_DeSel();
}
/*********************************************************************************************************
** oˉêy??3?: FM11_CS_ON
** oˉêy1|?ü: FM11μ?spi?ú????ON
** ê?è?2?êy: ?T
** ê?3?2?êy: ?T
** ·μ???μ: ?T
*********************************************************************************************************/
void FM11_CS_ON(void)
{
//disableInterrupts();
_FM11_Sel();
Delay_us(120);
}
/*********************************************************************************************************
** oˉêy??3?: FM11_CS_OFF
** oˉêy1|?ü: FM11μ?spi?ú????OFF
** ê?è?2?êy: ?T
** ê?3?2?êy: ?T
** ·μ???μ: ?T
*********************************************************************************************************/
void FM11_CS_OFF(void)
{
_FM11_DeSel()
//enableInterrupts();
}
/**********************************************************************************************************
** oˉêy??3?£oFM11?áD′ò???×??ú(SPI)
**********************************************************************************************************/
uint8_t FM11_SPI_SingleRW(uint8_t wData)
{
//·¢?íêy?Y
while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);
SPI_SendData(SPI1,wData);
//while (SPI_GetFlagStatus(SPI1, SPI_FLAG_BSY) == SET);
while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET);
//?óê?êy?Y
return SPI_ReceiveData(SPI1);
}
/**********************************************************************************************************
** oˉêy??3?£oFM11 D′?à??×??ú <=16??×??ú
**********************************************************************************************************/
void SPI_WriteByte(uint8_t *pData, uint32_t length)
{
for(; length>0; length--)
{
FM11_SPI_SingleRW(*pData);
pData++;
}
}
/**********************************************************************************************************
** oˉêy??3?£oFM11?á?à??×??ú <=16??×??ú
**********************************************************************************************************/
void SPI_readByte(uint8_t *pData, uint32_t length)
{
while(length--)
{
*pData = FM11_SPI_SingleRW(0xFF);
pData++;
}
}
/*********************************************************************************************************
** oˉêy??3?: FM11_WriteE2Enable
** oˉêy1|?ü: FM11μ?spi?úE2D′ê1?ü
** ê?è?2?êy: ?T
** ê?3?2?êy: ?T
** ·μ???μ: ?T
*********************************************************************************************************/
void FM11_WriteE2Enable(void)
{
FM11_CS_ON();
Delay_us(CS_DELAY); //?óê±è·±£FM11é?μ?íê3é
FM11_SPI_SingleRW(0xCE); //ê1?üE2ì?êa??á?£??è·¢?íCE
FM11_SPI_SingleRW(0x55); //ê1?üE2ì?êa??á?£??ù·¢?í55£?????μμμú30ò3
FM11_CS_OFF();
}
/*********************************************************************************************************
** oˉêy??3?: FM11_WriteE2Disable
** oˉêy1|?ü: FM11μ?spi?úE2D′???1
** ê?è?2?êy: ?T
** ê?3?2?êy: ?T
** ·μ???μ: ?T
*********************************************************************************************************/
void FM11_WriteE2Disable(void)
{
FM11_CS_ON();
Delay_us(CS_DELAY); //?óê±è·±£FM11é?μ?íê3é
FM11_SPI_SingleRW(0xCE); //ê§?üE2ì?êa??á?
FM11_SPI_SingleRW(0xAA); //ê§?üE2ì?êa??á?
FM11_CS_OFF();
}
/*********************************************************************************************************
** oˉêy??3?: FM11_WriteReg
** oˉêy1|?ü: D′FM11??′??÷
** ê?è?2?êy: reg:??′??÷μ??·
** val
′è?μ?2?êy
** ê?3?2?êy: ?T
** ·μ???μ: ?T
*********************************************************************************************************/
void FM11_WriteReg(uint8_t reg,uint8_t val)
{
uint8_t mode;
mode = reg & 0x0F;
FM11_CS_ON();
Delay_us(35);
FM11_SPI_SingleRW(mode); //??á???ê?2áμú28ò3
FM11_SPI_SingleRW(val);
FM11_CS_OFF();
// Delay_ms(100); //′?′|2??ü?óê±£?Dèòa?êò?????1¤£?ò??óê±??′??÷2ù×÷?í2??y3££?2??aμà?aê2?′
}
/*********************************************************************************************************
** oˉêy??3?: FM11_ReadReg
** oˉêy1|?ü: ?á??′??÷?μ
** ê?è?2?êy: reg:??′??÷μ??·
** ê?3?2?êy: ?T
** ·μ???μ: val,?á3?μ???′??÷?μ
*********************************************************************************************************/
uint8_t FM11_ReadReg(uint8_t reg)
{
uint8_t mode;
uint8_t val;
mode = reg&0x0F; //??á???ê?2áμú28ò3
mode = mode | 0x20; //??á???ê?2áμú28ò3
FM11_CS_ON();
FM11_SPI_SingleRW(mode);
val = FM11_SPI_SingleRW(0xFF);
FM11_CS_OFF();
return val;
}
/*********************************************************************************************************
** oˉêy??3?: FM11_WriteE2_Int
** oˉêy1|?ü: D′E2êy?Y
** ê?è?2?êy: adr:E2μ??·
** len
′è?μ?êy?Y3¤?è(<=16)
** *ibuf
′è?μ?êy?Y
** ê?3?2?êy: ?T
** ·μ???μ: ?T
*********************************************************************************************************/
void FM11_WriteE2_Int(uint16_t adr,uint32_t len,uint8_t *ibuf)
{
uint8_t buf[2];
buf[0] = (adr >> 8) & 0x03| 0x40; //′?′|è·è?ò???£?Dè2?Dèòa?ù′?·¢?íD′eeμ?μúò???×??úμ?ì?êa??á?
buf[1] = adr & 0xFF;
// printf("%s: adr = 0x%3x, len = %d, ibuf[0] = 0x%2x
", __func__, adr, len, ibuf[0]);
FM11_CS_ON();
Delay_us(100);
FM11_SPI_SingleRW(buf[0]);
FM11_SPI_SingleRW(buf[1]); //E2μ??·?a10bit£??a??×??ú????8bit£??1óDá????úaddr0
SPI_WriteByte(ibuf,len);
FM11_CS_OFF();
Delay_ms(20); //′?′|±?D?òa?ó?óê±£???ê?2áμú30ò3
}
/*********************************************************************************************************
** oˉêy??3?: FM11_WriteE2
** oˉêy1|?ü: D′E2êy?Y
** ê?è?2?êy: adr:E2μ??·
** len
′è?μ?êy?Y3¤?è?éò?′óóú16×??ú
** *ibuf
′è?μ?êy?Y
** ê?3?2?êy: ?T
** ·μ???μ: ?T
*********************************************************************************************************/
void FM11_WriteE2(uint16_t adr,uint32_t len,uint8_t *wbuf)
{
uint8_t offset;
FM11_WriteE2Enable();
// printf("%s: adr = 0x%3x, len = %d, wbuf[0] = 0x%2x
", __func__, adr, len, wbuf[0]);
if(adr < FM11_E2_USER_ADDR || adr >= FM11_E2_MANUF_ADDR)
return;
if(adr % FM11_E2_BLOCK_SIZE)
{
offset = FM11_E2_BLOCK_SIZE - (adr % FM11_E2_BLOCK_SIZE);
if(len > offset)
{
FM11_WriteE2_Int(adr,offset,wbuf);
adr += offset;
wbuf += offset;
len -= offset;
}
else
{
FM11_WriteE2_Int(adr,len,wbuf);
len = 0;
}
}
while(len)
{
if(len >= FM11_E2_BLOCK_SIZE)
{
FM11_WriteE2_Int(adr,FM11_E2_BLOCK_SIZE,wbuf);
adr += FM11_E2_BLOCK_SIZE;
wbuf += FM11_E2_BLOCK_SIZE;
len -= FM11_E2_BLOCK_SIZE;
}
else
{
FM11_WriteE2_Int(adr,len,wbuf);
len = 0;
}
}
}
/*********************************************************************************************************
** oˉêy??3?: FM11_ReadE2
** oˉêy1|?ü: ?áè?μ?E2êy?Y
** ê?è?2?êy: adr:E2μ??·
** len:?áè?μ?êy?Y3¤?è£??éò?′óóú16??×??ú
** *rbuf:?áè?μ?êy?Y
** ê?3?2?êy: ?T
** ·μ???μ: ?T
*********************************************************************************************************/
void FM11_ReadE2(uint16_t adr,uint32_t len,uint8_t *rbuf)
{
uint8_t buf[2];
//????à-μíoó£??è·¢?íò???×??úμ??üá?±à??0X63£???′??ú·¢?íò???×??úμ?μ??·
buf[0] = ((adr >> 8) & 0x03)| 0x60; //??á???ê?2áμú28ò3
buf[1] = adr & 0xFF;
FM11_CS_ON();
Delay_us(CS_DELAY); //?óê±è·±£FM11é?μ?íê3é
FM11_SPI_SingleRW(buf[0]);
FM11_SPI_SingleRW(buf[1]);
SPI_readByte(rbuf,len);
FM11_CS_OFF();
}
/*********************************************************************************************************
** oˉêy??3?: FM11_WriteFIFO
** oˉêy1|?ü: D′FIFO
** ê?è?2?êy: ilen
′êy?Y3¤?è(<=32 fifo????)
** *ibuf
′μ?êy?Y
** ê?3?2?êy: ?T
** ·μ???μ: ?T
*********************************************************************************************************/
void FM11_WriteFIFO(uint8_t *ibuf,uint32_t ilen)
{
FM11_CS_ON();
FM11_SPI_SingleRW(0x80);
SPI_WriteByte(ibuf,ilen);
FM11_CS_OFF();
}
/*********************************************************************************************************
** oˉêy??3?: ReadFIFO
** oˉêy1|?ü: ·¢?íNAK??
** ê?è?2?êy: *ilen:′y?áè?μ?êy?Y3¤?è
** ê?3?2?êy: *rbuf:?áè?μ?êy?Y
** ·μ???μ: ?áè?μ?êy?Y3¤?è
*********************************************************************************************************/
void FM11_ReadFIFO(uint32_t ilen,uint8_t *rbuf)
{
FM11_CS_ON();
FM11_SPI_SingleRW(0xA0);
SPI_readByte(rbuf,ilen);
FM11_CS_OFF();
}
/*********************************************************************************************************
** oˉêy??3?: FM11_Init
** oˉêy1|?ü: FM11μ?spi?ú3?ê??ˉ3ìDò
** ê?è?2?êy: ?T
** ê?3?2?êy: ?T
** ·μ???μ: ?T
*********************************************************************************************************/
void FM11_Init(void)
{
FM11_InitPort();
FM11_CS_OFF();
// FM11_WriteReg(MAIN_IRQ_MASK,0x44); //MAIN?D??????;?óê??aê??D??
// FM11_WriteReg(FIFO_IRQ_MASK,0x07); //FIFO?D??????
// FM11_WriteReg(NFC_CFG,0x03); //D′NFC????×?(??è??§3?-4)
FM11_WriteReg(FIFO_FLUSH,0xFF); //??fifo??′??÷
}
#ifndef __SPI_H_
#define __SPI_H_
#include "systick.h"
#define FM11_E2_BLOCK_SIZE 16
//ÒÔÏÂE2ÄÚ°üº¬Óû§Êý¾ÝºÍ³¡ÄÜÁ¿¶ÔÍ⹩µçÅäÖÃ
#define FM11_E2_USER_ADDR 0x000C
#define FM11_E2_MANUF_ADDR 0x039F
#define FIFO_ACCESS 0x00 //MCU¶ÁдFIFOµÄÈë¿ÚµØÖ·£¬SPI¶ÁдFIFOʹÓÃרÓÃÖ¸ÁîÂë
#define FIFO_FLUSH 0x01 //¹©MCUÇå¿ÕFIFOÄÚÈÝ
#define FIFO_WORDCNT 0x02 //¹©MCU²éѯFIFOÊ£Óà×Ö½Ú
#define RF_STATUS 0x03 //·Ç½Ó´¥¿Ú¹¤×÷״̬
#define RF_TXEN 0x04 //FIFO·ÃÎʼĴæÆ÷
#define RF_BAUD 0x05 //·Ç½ÓͨÐŲ¨ÌØÂÊÑ¡Ôñ
#define RF_RATS 0x06 //·Ç½ÓͨÐÅÊÕµ½µÄRATSÊý¾Ý
#define MAIN_IRQ 0x07 //Ö÷ÖжϱêÖ¾¼Ä´æÆ÷
#define FIFO_IRQ 0x08 //FIFOÖжϱêÖ¾¼Ä´æÆ÷
#define AUX_IRQ 0x09 //¸¨ÖúÖжϱêÖ¾¼Ä´æÆ÷
#define MAIN_IRQ_MASK 0x0A //Ö÷ÖжÏÆÁ±Î¼Ä´æÆ÷
#define FIFO_IRQ_MASK 0x0B //FIFOÖжÏÆÁ±Î¼Ä´æÆ÷
#define AUX_IRQ_MASK 0x0C //¸¨ÖúÖжÏÆÁ±Î¼Ä´æÆ÷
#define NFC_CFG 0x0D //NFCÅäÖüĴæÆ÷
#define REGU_CFG 0x0E //RegulatorÅäÖüĴæÆ÷
//ÒÔÏÂÊǶÔÖ÷ÖжϱêÖ¾¼Ä´æÆ÷(MAIN_IRQ)ÖеÄÿһλ½øÐÐÉèÖÃ
#define MAIN_IRQ_RF_PWON 0x80
#define MAIN_IRQ_ACTIVE 0x40
#define MAIN_IRQ_RX_START 0x20
#define MAIN_IRQ_RX_DONE 0x10
#define MAIN_IRQ_TX_DONE 0x08
#define MAIN_IRQ_ARBIT 0x04
#define MAIN_IRQ_FIFO 0x02
#define MAIN_IRQ_AUX 0x01
void FM11_InitPort(void);
void FM11_CS_ON(void);
void FM11_CS_OFF(void);
uint8_t FM11_SPI_SingleRW(uint8_t wData);
void SPI_WriteByte(uint8_t *pData, uint32_t length);
void SPI_readByte(uint8_t *pData, uint32_t length);
void FM11_WriteE2Enable(void);
void FM11_WriteE2Disable(void);
void FM11_WriteReg(uint8_t reg,uint8_t val);
uint8_t FM11_ReadReg(uint8_t reg);
void FM11_WriteE2_Int(uint16_t adr,uint32_t len,uint8_t *ibuf);
void FM11_WriteE2(uint16_t adr,uint32_t len,uint8_t *wbuf);
void FM11_ReadE2(uint16_t adr,uint32_t len,uint8_t *rbuf);
void FM11_WriteFIFO(uint8_t *ibuf,uint32_t ilen);
void FM11_ReadFIFO(uint32_t ilen,uint8_t *rbuf);
void FM11_Init(void);
#endif
一周热门 更多>