转载地址
#define SET_GPIO(A) NRF_GPIO->OUTSET = (1UL << (A))
#define CLEAR_GPIO(A) NRF_GPIO->OUTCLR = (1UL << (A))
#define READ_GPIO(A) NRF_GPIO->IN&(1<<(A))
#define OUTPUT_GPIO(A) nrf_gpio_cfg_output(A)
#define INPUT_GPIO(A) nrf_gpio_cfg_input(A,NRF_GPIO_PIN_NOPULL)
static void hal_spi_init (void)
{
OUTPUT_GPIO(LORA_NSS_PIN);
OUTPUT_GPIO(LORA_SCK_PIN);
OUTPUT_GPIO(LORA_MOSI_PIN);
INPUT_GPIO(LORA_MISO_PIN);
OUTPUT_GPIO(LORA_NRST_PIN);
INPUT_GPIO(LORA_BUSY_PIN);
CLEAR_GPIO(LORA_SCK_PIN);
}
void hal_spi_select (int on)
{
if(on==0)
{
SET_GPIO(LORA_NSS_PIN);
}else
{
CLEAR_GPIO(LORA_NSS_PIN);
}
}
// perform SPI transaction with radio
u1_t hal_spi (u1_t out)
{
#define CPHA 0
#define CPOL 0
u1_t dataValue=0,i,wr_data;;
wr_data=out;
#if CPHA==0 && CPOL ==0
for(i=0;i<8;i++)//以MSB方式按位接收一个字节数据,上升沿一位数据被存入移位寄存器
{
if(wr_data&0x80)
{
SET_GPIO(LORA_MOSI_PIN) ;
}else
{
CLEAR_GPIO(LORA_MOSI_PIN);
}
SET_GPIO(LORA_SCK_PIN);
wr_data<<=1;
dataValue<<=1;
if(READ_GPIO(LORA_MISO_PIN))
dataValue|=0x01;
CLEAR_GPIO(LORA_SCK_PIN);
__NOP();
}
#elif #if CPHA==0 && CPOL ==1
for(i=0;i<8;i++)//以MSB方式按位接收一个字节数据,上升沿一位数据被存入移位寄存器
{
if(wr_data&0x80)
{
SET_GPIO(LORA_MOSI_PIN) ;
}else
{
CLEAR_GPIO(LORA_MOSI_PIN);
}
CLEAR_GPIO(LORA_SCK_PIN);
wr_data<<=1;
dataValue<<=1;
if(READ_GPIO(LORA_MISO_PIN))
dataValue|=0x01;
SET_GPIO(LORA_SCK_PIN);
__NOP();
}
#elif #if CPHA==1 && CPOL ==0
for(i=0;i<8;i++)//以MSB方式按位接收一个字节数据,上升沿一位数据被存入移位寄存器
{
SET_GPIO(LORA_SCK_PIN);
if(wr_data&0x80)
{
SET_GPIO(LORA_MOSI_PIN) ;
}else
{
CLEAR_GPIO(LORA_MOSI_PIN);
}
CLEAR_GPIO(LORA_SCK_PIN);
wr_data<<=1;
dataValue<<=1;
if(READ_GPIO(LORA_MISO_PIN))
dataValue|=0x01;
}
#elif #if CPHA==1 && CPOL ==1
for(i=0;i<8;i++)//以MSB方式按位接收一个字节数据,上升沿一位数据被存入移位寄存器
{
CLEAR_GPIO(LORA_SCK_PIN);
if(wr_data&0x80)
{
SET_GPIO(LORA_MOSI_PIN) ;
}else
{
CLEAR_GPIO(LORA_MOSI_PIN);
}
SET_GPIO(LORA_SCK_PIN);
wr_data<<=1;
dataValue<<=1;
if(READ_GPIO(LORA_MISO_PIN))
dataValue|=0x01;
}
#endif
return dataValue;
}