8个月前
减少DA14695上的SPI CS计时?
发布的eric_fan.0点 4回复你好,
我是新的对话框,我使用DA14695和USB DK学习样本代码(SDK版本:10.0.8.105,WIRA 10.440.8.6)。
我试图使用SPI模块并用LA录制SPI波形,发现CS引脚花了太长。
我的SPI速度是4MHz, CLK计时大约0.25us / bit,但是CS从低到高花了将近90us…
时序图如:
CS销低 ---------- 我们等待40 ---------- 9-bit数据(总3 ) ---------- 我们等待40 ---------- CS销高
有没有办法缩短CS引脚时间来加速SPI?
谢谢! !
我的SPI写字代码如下所示:
void spi_send_data(uint8_t dat){#if 1 // spi 9位模式ad_spi_activate_cs(spihandle);AD_SPI_WRITE_9TH_BIT(SPIHandle,0x01);spi_send_8b(dat);// ad_spi_deactivate_cs_when_spi_done(spihandle);ad_spi_deactivate_cs(spihandle);#万一 }
8个月前
你好lc_dialog,
谢谢你的支持!
我在WiRa_10.440.8.6 SDK中使用“ble_range_dte”样例项目,关于SPI移植的部分在“ble_peripheral_task”中。
SPI初始设置是:
#include“ad_spi.h”/ * spi芯片选择引脚* /静态const ad_io_conf_t spi_master_cs [] = {{.port = custom_device_cs_gpio_port,.pin = custom_device_cs_gpio_pin,.on = {.mode = hw_gpul,.function = hw_gpio_func_spi_en,。high = true},.off = {.mode = hw_gpio_mode_output_push_pull,.function = hw_gpio_func_spi_en,.high = true}},};/ * SPI1 IO * /常量ad_spi_io_conf_t bus_SPI1 = {.spi_do = {.port = SPI1_DO_GPIO_PORT,.pin = SPI1_DO_GPIO_PIN,。对= {HW_GPIO_MODE_OUTPUT_PUSH_PULL,HW_GPIO_FUNC_SPI_DO,FALSE},.off = {HW_GPIO_MODE_INPUT,HW_GPIO_FUNC_GPIO,TRUE},},。SPI_DI = {.port = SPI1_DI_GPIO_PORT,.pin = SPI1_DI_GPIO_PIN,。对= {HW_GPIO_MODE_INPUT,HW_GPIO_FUNC_SPI_DI,FALSE},.off = {HW_GPIO_MODE_INPUT,HW_GPIO_FUNC_GPIO,TRUE},},.spi_clk = {.port = SPI1_CLK_GPIO_PORT,.pin = SPI1_CLK_GPIO_PIN,.on = {hw_gpio_mode_output_push_pull,hw_gpio_func_spi_clk,false},.off = {hw_gpio_mode_input,hw_gpio_func_gpio,true},/ * * spi_master_cs数组中的引脚数。* * \警告SNC \ P CS_CNT使用SPI总线必须始终为1 * / .cs_cnt = 1,.spi_cs = spi_master_cs,.voltage_level = hw_gpio_power_v33 //您可以在此定义所需的电压电平};/ * SPI1总线配置* / SPI_BUS_T SPI1 =&BUS_SPI1;/ *外部传感器/模块SPI驱动程序* / const ad_spi_driver_conf_t drv_spi1 = {.spi = {.cs_pad = {custom_device_cs_gpio_port,custom_device_cs_gpio_pin},.word_mode = hw_spi_word_9bit,//在这里,您可以在这里定义所需的.smn_role = hw_spi_mode_master,.polarity_mode = hw_spi_pol_high,//您可以在这里定义所需的SPI极性.phase_mode = hw_spi_pha_mode_0,//您可以在此处定义所需的SPI阶段.mint_mode = hw_spi_mint_disable,.xtal_freq = hw_spi_freq_div_8,//您可以在此声明您自己的SPI速度.fifo_mode = hw_spi_fifo_rx_tx,.disabled = 0,/ *应在初始化阶段* / .ignore_cs = false禁用,.use_dma = true,.rx_dma_channel = hw_dma_channel_0,.tx_dma_channel = hw_dma_channel_1};/*传感器/模块设备配置*/ const ad_spi_controller_conf_t dev_SPI_CUSTOM_DEVICE = {.id = HW_SPI1, .io = &bus_SPI1, .drv = &drv_SPI1};spi_device spi_custom_device =&dev_spi_custom_device;
#定义SPI1_DO_GPIO_PORT (HW_GPIO_PORT_0) # define SPI1_DO_GPIO_PIN (HW_GPIO_PIN_26) # define SPI1_DI_GPIO_PORT (HW_GPIO_PORT_0) # define SPI1_DI_GPIO_PIN (HW_GPIO_PIN_24) # define SPI1_CLK_GPIO_PORT (HW_GPIO_PORT_0) # define SPI1_CLK_GPIO_PIN (HW_GPIO_PIN_21) / * SPI芯片选择销(s) * / #定义CUSTOM_DEVICE_CS_GPIO_PORT (HW_GPIO_PORT_0) #define CUSTOM_DEVICE_CS_GPIO_PIN (HW_GPIO_PIN_20)
3个月前
你好对话框,
在我的情况下我有同样的问题。
我的设备使用DA1469x PRO套件+ DA14699子板。
使用PXP_Reporter包括SPI功能。
我使用SPI和一个字节的时钟和数据只是50ns,但cs需要5us,如何减少SPI cs计时?
使用HW_SPI_WRITE_BUF和AD_SPI_WRITE输出1字节CS TIMEING需要20US和5US。
环境 :
/ * SPI1 IO * / const ad_spi_io_conf_t bus_SPI1 = {.spi_do = {.port = SPI1_DO_GPIO_PORT / / HW_GPIO_PORT_1 .pin = SPI1_DO_GPIO_PIN / / HW_GPIO_PIN_1碧绿= {HW_GPIO_MODE_OUTPUT_PUSH_PULL HW_GPIO_FUNC_SPI_DO,假},.off =} {HW_GPIO_MODE_INPUT HW_GPIO_FUNC_GPIO,如此,},.spi_clk = {.port = SPI1_CLK_GPIO_PORT,// HW_GPIO_PORT_1 .pin = SPI1_CLK_GPIO_PIN, //HW_GPIO_PIN_2 .on = {HW_GPIO_MODE_OUTPUT_PUSH_PULL, HW_GPIO_FUNC_SPI_CLK, false}, .off = {HW_GPIO_MODE_INPUT, HW_GPIO_FUNC_GPIO, true},}, /* * spi_master_cs array引口个数。/ .cs_cnt = 1, .spi_cs = spi_master_cs, // HW_GPIO_PORT_1 HW_GPIO_PIN_5 .voltage_level = HW_GPIO_POWER_VDD1V8P //这里你可以定义所需的电压水平};/ *外部传感器/模块SPI驱动* / const ad_spi_driver_conf_t drv_SPI1 = {.spi = {.cs_pad = {CUSTOM_DEVICE_CS_GPIO_PORT, CUSTOM_DEVICE_CS_GPIO_PIN}, .word_mode = HW_SPI_WORD_8BIT / /这里您可以定义所需的.smn_role = HW_SPI_MODE_MASTER .polarity_mode = HW_SPI_POL_LOW,/ /这里可以定义所需的SPI极性.phase_mode = HW_SPI_PHA_MODE_0 / /这里您可以定义所需的SPI阶段.mint_mode = HW_SPI_MINT_DISABLE .xtal_freq = HW_SPI_FREQ_DIV_2 / /这里你可以声明自己的SPI速度32 mhz = > / 2 = > 16兆赫.fifo_mode = HW_SPI_FIFO_RX_TX .disabled = 0,/*在初始化阶段应该禁用*/ .ignore_cs = false, .use_dma = true, .rx_dma_channel = HW_DMA_CHANNEL_0, .tx_dma_channel = HW_DMA_CHANNEL_1}};/*传感器/模块设备配置*/ const ad_spi_controller_conf_t dev_SPI_CUSTOM_DEVICE = {.id = HW_SPI1, .io = &bus_SPI1, .drv = &drv_SPI1};ad_spi_handle_t SPI_handle_t;void SPI_CMD_WRITE(const uint8_t *wbuf, size_t wlen) {hw_gpio_set_inactive(HW_GPIO_PORT_1, HW_GPIO_PIN_3);ad_spi_activate_cs (SPI_handle_t); // CS DC activate //ad_spi_write_async(HW_SPI1,wbuf,wlen,NULL,NULL); //ad_spi_write(SPI_handle_t,wbuf,wlen); hw_spi_write_buf(HW_SPI1,wbuf,wlen,NULL,NULL); ad_spi_deactivate_cs_when_spi_done(SPI_handle_t); hw_gpio_set_active(HW_GPIO_PORT_1, HW_GPIO_PIN_3); // CS DC release } void SPI_TEST_task(void *params) { ad_spi_init(); SPI_handle_t = ad_spi_open((ad_spi_controller_conf_t *)SPI_CUSTOM_DEVICE); //ad_spi_deactivate_cs(SPI_handle_t); hw_gpio_set_inactive(HW_GPIO_PORT_1, HW_GPIO_PIN_4); OS_DELAY_MS(110); hw_gpio_set_active(HW_GPIO_PORT_1, HW_GPIO_PIN_4); printf("\n\reset_end \n\r"); OS_DELAY_MS(200); // ad_spi_activate_cs(SPI_handle_t); a[0]=1; SPI_CMD_WRITE(a,1); /* ad_spi_activate_cs(SPI_handle_t); hw_gpio_set_inactive(HW_GPIO_PORT_1, HW_GPIO_PIN_3); ad_spi_write(SPI_handle_t,a,1); ad_spi_deactivate_cs_when_spi_done(SPI_handle_t); hw_gpio_set_active(HW_GPIO_PORT_1, HW_GPIO_PIN_3); */ while(1) { OS_DELAY_MS(500); printf("\n\r in while loop \n\r"); } }
fifo_mode设置
我只需要spi数据到lcd(4行)
但是,当我更改SPI设置时.fifo_mode = hw_spi_fifo_rx_tx,=> hw_spi_fifo_tx_only,始终在assert_warning中运行((cfg-> fifo_mode == hw_spi_fifo_rx_tx)||
(cfg - > fifo_mode = = HW_SPI_FIFO_NONE));
polarity_mode设置
我更改hw_spi_pol_low => hw_spi_pol_high
在逻辑分析仪中,只是clk引脚拉起数据引脚不是。
这
谢谢! !
附件 | 尺寸 |
---|---|
SPI.pdf | 464.57 KB. |
2个月前
嗨Kuo41006,
道歉 - 可能是我错过了你的评论。让我检查一下,我会回复你。
与此同时,你检查了吗?DA1469X教程SPI适配器概念教程?
如果您可以通过问题培养新的论坛机票,这将是非常有帮助的。
谢谢,PM_DIALOG.
8个月前
嗨eric_fan,
我正在调查这个问题,会尽快回复你。
你能确认一下你一直在用哪个项目吗?
最好的问候,
LC_Dialog