1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
/********************************************************
* SI24R1接收模式初始化
* 参数说明:无
* 返回值:无
*********************************************************/
void Int_SI24R1_RX_Mode(void)
{
CE_LOW;
Int_SI24R1_Write_Buf(SI24R1_WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 设置接收地址
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + EN_AA, 0x01); //使能数据管道0的自动应答
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + EN_RXADDR, 0x01); //使能数据管道0的接收地址
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + RF_CH, 40); //选择射频通道40
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); //接收数据管道0数据字节数
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + RF_SETUP, 0x06); //数据传输速率1Mbps,发送功率4dBm
Int_SI24R1_Write_Reg( SI24R1_WRITE_REG+ CONFIG, 0x0f); //CRC使能 16位CRC,接收模式,电源开启
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + STATUS, 0xff); //清除状态寄存器的中断标志
CE_HIGH;
}
/********************************************************
* SI24R1发送模式初始化
* 参数说明:无
* 返回值:无
*********************************************************/
void Int_SI24R1_TX_Mode(void)
{
CE_LOW;
Int_SI24R1_Write_Buf(SI24R1_WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
Int_SI24R1_Write_Buf(SI24R1_WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + EN_AA, 0x01); //
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + EN_RXADDR, 0x01); //
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + SETUP_RETR, 0x0a); //
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + RF_CH, 40); //
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + RF_SETUP, 0x06); //
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG + CONFIG, 0x0e);
CE_HIGH;
}
/********************************************************
* 读取接收数据 硬件直接接收数据保存到队列中
* 参数说明:
* rxbuf: 用于存储接收数据的缓冲区
* 返回值:0:接收成功 1:接收失败
*********************************************************/
uint8_t Int_SI24R1_RxPacket(uint8_t *rxbuf)
{
uint8_t state;
// 读取状态寄存器的值 原封不懂写回状态寄存器 =》状态寄存器设置写1清除
state = Int_SI24R1_Read_Reg(STATUS); //读取状态寄存器的值
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG+STATUS,state); //清除RX_DS中断标志位
if(state & RX_DR) //接收数据
{
Int_SI24R1_Read_Buf(RD_RX_PLOAD,rxbuf,TX_PLOAD_WIDTH); //读取数据
Int_SI24R1_Write_Reg(FLUSH_RX,0xff); //清除RX FIFO缓冲区
return 0;
}
return 1; //
}
/********************************************************
* 发送数据
* 参数说明:
* txbuf: 用于存储发送数据的缓冲区
* 返回值:0:发送成功 1:发送失败
*********************************************************/
uint8_t Int_SI24R1_TxPacket(uint8_t *txbuf)
{
uint8_t state;
//先进入配置模式,写入数据
CE_LOW; //CE拉低 使能SI24R1 //CEͣʹSI24R1
Int_SI24R1_Write_Buf(WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH); //写数据到TX FIFO 32个字节
CE_HIGH; //CE拉高 使能发送 //CEøߣʹܷ
//没有使用中断判断是否发送完成 =》使用轮询读取状态标志位
//while(IRQ == 1); //ȴ
state = Int_SI24R1_Read_Reg(STATUS); //读取状态寄存器
while((state & (TX_DS | MAX_RT)) == 0) //等待发送完成 发送成功或者达到最大重发次数
{
state = Int_SI24R1_Read_Reg(STATUS); //读取状态寄存器
vTaskDelay(10);
}
Int_SI24R1_Write_Reg(SI24R1_WRITE_REG+STATUS, state); //清除TX_DS或MAX_RT中断标志位
if(state & MAX_RT) //如果达到最大收发次数
{
Int_SI24R1_Write_Reg(FLUSH_TX,0xff); //手动清除TX FIFO缓冲区
return 1;
}
if(state & TX_DS) //发送成功
{
return 0;
}
return 1; //发送失败
}
|