930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 18033|回复: 5

nRF52832 timer+PPI+SPI(DMA) 控制 dac的程序问题,大家来找茬~非常感谢!!!

[复制链接]

2

主题

6

帖子

34

积分

新手上路

Rank: 1

积分
34
发表于 2018-10-12 10:55:36 | 显示全部楼层 |阅读模式
【问题】:现在测试是Timer每次通过PPI触发SPI写,SPI写完调用回调函数,回调函数中测试 NRF_SPIM2->TXD.PTR  的每次都是正常递增变化的,但是DAC就是没有实际的输出;
PS:1、要写的源数据测试是正确的;
        2、为了不频繁占用CPU资料,用的PPI,用上后 timer+PPI+SPI(DMA) 写DAC  一直没调通,不加PPI的timer+SPI 写DAC  是OK的;

【源码】:
  //定义定时器配置结构体,并使用默认配置参数初始化结构体
   nrf_drv_timer_config_t timer_cfg =NRF_DRV_TIMER_DEFAULT_CONFIG;

  //初始化定时器,初始化时会注册timer_led_event_handler事件回调函数
    err_code = nrf_drv_timer_init(&TIMER_DAC, &timer_cfg, timer_DAC_event_handler);
    APP_ERROR_CHECK(err_code);


  //定时时间(单位us)转换为ticks
    time_ticks = nrf_drv_timer_us_to_ticks(&TIMER_DAC, time_us);
printf("time_us= %d,time_ticks= %d \r\n",time_us,time_ticks);
    //设置定时器捕获/比较通道及该通道的比较值,使能通道的比较中断
    nrf_drv_timer_extended_compare(
         &TIMER_DAC, NRF_TIMER_CC_CHANNEL0, time_ticks, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false);


  /* 初始化SPI2 */

nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
    spi_config.mosi_pin = DAC_SPI_MOSI;
    spi_config.sck_pin  = DAC_SPI_SCK;
spi_config.ss_pin  = DAC_SPI_SS;
nrf_gpio_cfg_output(DAC_SPI_SS);
spi_config.frequency= NRF_SPI_FREQ_8M;

    APP_ERROR_CHECK(nrf_drv_spi_init(&DAC_spi, &spi_config, spi_event_handler));
DAC_SPIDMA_Init();
    printf("DAC_SPI_Init OK \r\n");
    nrf_delay_ms(500);     

//关联SPI  DMA缓存

NRF_SPIM2->TXD.MAXCNT = 2;        
//        NRF_SPIM2->RXD.MAXCNT = 2;
NRF_SPIM2->TXD.LIST=1;
NRF_SPIM2->TXD.PTR=(uint32_t)&SPI2ArrayList;   //SPI2ArrayList;

    //初始化PPI程序模块
  uint32_t err_code = NRF_SUCCESS;
  err_code = nrf_drv_ppi_init();
    APP_ERROR_CHECK(err_code);

    //分配PPI通道,注意PPI通道的分配是由驱动函数完成的,分配的通道号保存到my_ppi_channel
    err_code = nrf_drv_ppi_channel_alloc(&timer2DAC_ppi_channel);
    APP_ERROR_CHECK(err_code);
  //分配PPI通道的EEP和TEP
    err_code = nrf_drv_ppi_channel_assign(timer2DAC_ppi_channel,
                                          nrf_drv_timer_compare_event_address_get(&TIMER_DAC,NRF_TIMER_CC_CHANNEL0),
                                         nrf_drv_spi_start_task_get(&DAC_spi));
//     nrf_drv_gpiote_out_task_addr_get(LED_2)
    APP_ERROR_CHECK(err_code);
  //使能PPI通道
  err_code = nrf_drv_ppi_channel_enable(timer2DAC_ppi_channel);
    APP_ERROR_CHECK(err_code);       
printf("PPI enable OK \r\n");

nrf_drv_timer_enable(&TIMER_DAC);
printf("nrf_drv_timer_enable OK \r\n");


void spi_event_handler(nrf_drv_spi_evt_t const * p_event)
{
uint8_t i=0;
DAC_COUNT++;
if(DAC_COUNT==DAC_NUMBER)
{
DAC_COUNT=0;
NRF_SPIM2->TXD.PTR=(uint32_t)&SPI2ArrayList;
}
          printf("NRF_SPIM2->TXD.AMCOUNT= %d \r\n",NRF_SPIM2->TXD.AMOUNT);
printf("NRF_SPIM2->TXD.PTR = %x \r\n", NRF_SPIM2->TXD.PTR);
}
回复

使用道具 举报

2

主题

6

帖子

34

积分

新手上路

Rank: 1

积分
34
 楼主| 发表于 2018-10-12 11:23:23 | 显示全部楼层
求助,感谢!
回复

使用道具 举报

2

主题

6

帖子

34

积分

新手上路

Rank: 1

积分
34
 楼主| 发表于 2018-10-12 16:40:37 | 显示全部楼层
测试发现SPI的CS 始终为高,用飞线短接地,再松手(大概1s一次,timer周期就是1s)DAC就会有正常输出,很奇怪,不知道哪里把CS常置为高电平了,大神们求帮忙;
回复 支持 反对

使用道具 举报

4

主题

46

帖子

208

积分

中级会员

Rank: 3Rank: 3

积分
208
发表于 2018-10-12 17:03:57 | 显示全部楼层
wzy20100101654 发表于 2018-10-12 16:40
测试发现SPI的CS 始终为高,用飞线短接地,再松手(大概1s一次,timer周期就是1s)DAC就会有正常输出,很奇 ...

是不是没配置SPI的CS引脚,SPI的CS引脚是用普通GPIO的,初始化SPI的时候,要配置CS引脚。
回复 支持 反对

使用道具 举报

2

主题

6

帖子

34

积分

新手上路

Rank: 1

积分
34
 楼主| 发表于 2018-10-13 15:18:32 | 显示全部楼层
【根因】PPI触发,全硬件运行的,没有去软件设置CS,所以,CS一直为高;
【解决方案】:二级任务端点 设置成CS pin(通过GPIOTE实现)后,Timer 通过PPI触发 CS拉低+ SPI写;

感谢 艾克姆  强光手电 兄弟给予的指点,谢谢!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2022-9-7 14:38:48 | 显示全部楼层
你是怎么写定时器回调函数timer_DAC_event_handler,我写的定时器通过PPI去控制LED灯,没反应
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

GMT+8, 2024-4-23 21:40 , Processed in 0.069464 second(s), 21 queries .

快速回复 返回顶部 返回列表