DECAWAVE上给了好多例程,第一个便是使用DW1000发送数据,但是官方例程全部都是使用的IDE是CooCox,想要看官方源码的又没有的可以留言找我要。
我是用的驱动方式为SPI,但是SPI的有四种工作模式,由GPIO.5和GPIO.6上拉或者下拉来决定,具体见下表。
我使用的为第一种工作模式,因此在第一个跳变沿出发,空闲状态为低电平。
DW1000发送流程:SPI初始化---->中断初始化---- >复位DW1000---->设置SPI速率为3MHZ以下---->初始化DW1000---->设置SPI速率为高速率模式---->将配置好的结构体写入DW1000---->将需要发送的数据写入DW1000---->DW1000的帧格式控制---->发送数据---->读DW1000寄存器发送状态是否发送完成---->发送完成在该位写1清除标志---->完成。
以下为代码片
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//中断分组
delay_init(72);//延时初始化
DW1000_IRQ_INIT();//中断初始化
DW1000_SPI_INIT();//SPI初始化
if(DW1000_Wakeup() != DWT_SUCCESS)//DW1000不能被RESET线唤醒,所以需要将将其唤醒
while(1);
reset_DW1000();//复位DW1000
spi_set_rate_low();//设置DW1000为SPI波特率
if (dwt_initialise(DWT_LOADNONE) == DWT_ERROR)//初始化DW1000,官方例程
while (1);
spi_set_rate_high();//把DW1000的SPI波特率重新设置为高
dwt_configure(&config);//将配置结构体写入DW1000
while(1)
{
dwt_writetxdata(sizeof(buf), buf, 0); //写数据
dwt_writetxfctrl(sizeof(buf), 0, 0);//数据格式与是否测距
dwt_starttx(DWT_START_TX_IMMEDIATE);//开始发送
while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS));//等待发送完成
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);//清除标志位
delay_ms(1000);//1s发送一次
}
}
配置结构体
static dwt_config_t config = {
2, /*DW1000频道,频道相同才可通讯*/
DWT_PRF_64M, /* 脉冲重复频率. */
DWT_PLEN_1024, /* 前导码长度. Used in TX only. */
DWT_PAC32, /* 接收PAC大小. Used in RX only. */
9, /* 发送的前导字节长度,用于侦控制 */
9, /* 接收的前导字节长度,用于侦控制 */
1, /* 0 使用标准 SFD, 1 使用非标准 SFD. */
DWT_BR_110K, /* 数据波特率,相同波特率才可通讯 */
DWT_PHRMODE_STD, /* PHR长度. */
(1024 + 1 + 64 - 32) /* SFD 超时时间 (preamble length + 1 + SFD length - PAC size). Used in RX only. *///
};
下图给出了接收时建议使用的PAC大小配置,本文使用前导码长度为1024,PAC大小为32.
发送的数据buf
static u8 buf[]={'M','o','l','i','a','m','!'};
----------------------------再次编辑分割线(2020/3/24)---------------------------
我已经在我的资源里上传了官方例程的代码,以及cocox的IDE安装包。