This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nRF52832: timer+PPI+SPI(DMA) can not control dac nicely

【Question】:I want to use timer+ppi+SPI(with DMA)  write DAC, but now something is wrong, when timer trigger the SPI to write DAC through PPI,  it can call the "spi_event_handler" after  the SPI write is finished, and NRF_SPIM2->TXD.PTR increases normally in the "spi_event_handler" ,but  there is still no output in DAC; Ireally do not know what's wrong. When I use  timer+SPI write DAC, everything is OK. Please help me, thanks. The following is code: 

 //定义定时器配置结构体,并使用默认配置参数初始化结构体
   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);
}

typedef struct ArrayList
{
uint8_t buffer[2];
} ArrayList_type;

ArrayList_type SPI2ArrayList[8];

Related