xutong 发表于 2023-1-10 12:13

RT1052 (7) 驱动SPI-DAC

<div class='showpostmsg'><h1>RT1052 (7) 驱动SPI-DAC</h1>

<p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先在Bsp文件夹新建DAC目录,如下所示,因为是基于第4篇的工程文件,所以直接从第4篇下载工程文件即可。</p>

<p align="center" > &nbsp;</p>

<p align="center" >图1:BSP文件夹</p>

<p align="center" > &nbsp;</p>

<p align="center" >图2:放入DAC驱动</p>

<p >Dac .c文件</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black" valign="top">
                        <p align="left" >#include &quot;AD5668.h&quot;</p>

                        <p align="left" >/*</p>

                        <p align="left" >&nbsp; &nbsp; Channel Selection Range 1~16</p>

                        <p align="left" >&nbsp; &nbsp; Value Range 0~65535</p>

                        <p align="left" >*/</p>

                        <p align="left" >void DAC_Write(uint8_t channel,uint16_t Value)</p>

                        <p align="left" >{</p>

                        <p align="left" >&nbsp; &nbsp; uint16_t Date,temp;</p>

                        <p align="left" >&nbsp; &nbsp; if(channel&lt;=8)</p>

                        <p align="left" >&nbsp; &nbsp; {</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; DAC_CS1_L;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; /* Select Channel */</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date=WriteAndUpDateCh;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date&lt;&lt;=4;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date|=channel-1;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date&lt;&lt;=4;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; temp=Value&gt;&gt;12;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date|=temp;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Soft_SPI_Write(Date);</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date=Value&lt;&lt;4;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Soft_SPI_Write(Date);</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; DAC_CS1_H;</p>

                        <p align="left" >&nbsp; &nbsp; }</p>

                        <p align="left" >&nbsp; &nbsp; else</p>

                        <p align="left" >&nbsp; &nbsp; {</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; DAC_CS2_L;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; /* Select Channel */</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date=WriteAndUpDateCh;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date&lt;&lt;=4;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date|=channel-9;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date&lt;&lt;=4;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; temp=Value&gt;&gt;12;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date|=temp;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Soft_SPI_Write(Date);</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Date=Value&lt;&lt;4;</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; Soft_SPI_Write(Date);</p>

                        <p align="left" >&nbsp; &nbsp; &nbsp; &nbsp; DAC_CS2_H;</p>

                        <p align="left" >&nbsp; &nbsp; }</p>

                        <p align="left" >}</p>

                        <p align="left" >/*</p>

                        <p align="left" >&nbsp; &nbsp; Initial DAC GPIO</p>

                        <p align="left" >*/</p>

                        <p align="left" >void DAC_Init(void)</p>

                        <p align="left" >{</p>

                        <p align="left" >&nbsp; &nbsp; GPIO_InitTypeDef GPIO_InitStruct;</p>

                        <p align="left" >&nbsp; &nbsp; __HAL_RCC_GPIOC_CLK_ENABLE();</p>

                        <p align="left" >&nbsp; &nbsp; GPIO_InitStruct.Pin = DAC_CLR_PIN;</p>

                        <p align="left" >&nbsp; &nbsp; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;</p>

                        <p align="left" >&nbsp; &nbsp; GPIO_InitStruct.Pull = GPIO_PULLDOWN;</p>

                        <p align="left" >&nbsp; &nbsp; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;</p>

                        <p align="left" >&nbsp; &nbsp; HAL_GPIO_Init(DAC_CLR_PORT,&amp;GPIO_InitStruct);</p>

                        <p align="left" >&nbsp; &nbsp; DAC_CLR_L;</p>

                        <p align="left" >&nbsp; &nbsp; /* OPEN INTERANL REFERENCE */</p>

                        <p align="left" >&nbsp; &nbsp; DAC_CS1_L;</p>

                        <p align="left" >&nbsp; &nbsp; Soft_SPI_Write(0x08f0);</p>

                        <p align="left" >&nbsp; &nbsp; Soft_SPI_Write(0x0001);</p>

                        <p align="left" >&nbsp; &nbsp; DAC_CS1_H;</p>

                        <p align="left" >&nbsp; &nbsp; DAC_CS2_L;</p>

                        <p align="left" >&nbsp; &nbsp; Soft_SPI_Write(0x08f0);</p>

                        <p align="left" >&nbsp; &nbsp; Soft_SPI_Write(0x0001);</p>

                        <p align="left" >&nbsp; &nbsp; DAC_CS2_H;</p>

                        <p align="left" >}</p>

                        <p align="left" >&nbsp;</p>

                        <p >&nbsp;</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >Dac.h文件</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black" valign="top">
                        <p align="left" >#ifndef __AD5668_H</p>

                        <p align="left" >#define __AD5668_H</p>

                        <p align="left" >#include &quot;main.h&quot;</p>

                        <p align="left" >#include &quot;STM32_SPI.h&quot;</p>

                        <p align="left" >/*</p>

                        <p align="left" >&nbsp; &nbsp; AD5668 COMMAND AND ADDRESS</p>

                        <p align="left" >&nbsp; &nbsp; MSB</p>

                        <p align="left" >&nbsp; &nbsp; 31 30 29 28 &nbsp;27 26 25 24</p>

                        <p align="left" >&nbsp; &nbsp; X &nbsp; X &nbsp;X &nbsp;X &nbsp;C3 C2 C1 C0</p>

                        <p align="left" >&nbsp; &nbsp; 23 22 21 20 &nbsp;19 &nbsp; &nbsp; &nbsp; &nbsp; -&gt; &nbsp; &nbsp; &nbsp;5</p>

                        <p align="left" >&nbsp; &nbsp; A3 A2 A1 A0 &nbsp;Data Msb-&gt; DataLSB</p>

                        <p align="left" >&nbsp; &nbsp; 4 3 2 1</p>

                        <p align="left" >&nbsp; &nbsp; X X X X</p>

                        <p align="left" >*/</p>

                        <p align="left" >/*</p>

                        <p align="left" >&nbsp; &nbsp; COMMAND</p>

                        <p align="left" >*/</p>

                        <p align="left" >#define &nbsp;UpdateDacReg &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0X01</p>

                        <p align="left" >#define &nbsp;WriteAndUpDateCh &nbsp; &nbsp; &nbsp; 0x03 &nbsp; &nbsp;</p>

                        <p align="left" >#define &nbsp;ResetDac &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x07</p>

                        <p align="left" >#define &nbsp;SetUpRef &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x80</p>

                        <p align="left" >/*</p>

                        <p align="left" >&nbsp; &nbsp; ADDRESS &nbsp;</p>

                        <p align="left" >*/</p>

                        <p align="left" >#define &nbsp;ChannelA &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0X00</p>

                        <p align="left" >#define &nbsp;ChannelB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0X01</p>

                        <p align="left" >#define &nbsp;ChannelC &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0X02</p>

                        <p align="left" >#define &nbsp;ChannelD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0X03</p>

                        <p align="left" >#define &nbsp;ChannelE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0X04</p>

                        <p align="left" >#define &nbsp;ChannelF &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0X05</p>

                        <p align="left" >#define &nbsp;ChannelG &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0X06</p>

                        <p align="left" >#define &nbsp;ChannelH &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0X07</p>

                        <p align="left" >#define &nbsp;ChannelAll &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0X0F</p>

                        <p align="left" >/*</p>

                        <p align="left" >&nbsp; &nbsp; Ctrl GPIO redefine</p>

                        <p align="left" >*/</p>

                        <p align="left" >#define &nbsp;DAC_CS1_L &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SF_NSS1_L</p>

                        <p align="left" >#define &nbsp;DAC_CS1_H &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SF_NSS1_H</p>

                        <p align="left" >#define &nbsp;DAC_CS2_L &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SF_NSS2_L</p>

                        <p align="left" >#define &nbsp;DAC_CS2_H &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SF_NSS2_H</p>

                        <p align="left" >#define &nbsp;DAC_CLR_PORT &nbsp; &nbsp; &nbsp; GPIOC</p>

                        <p align="left" >#define &nbsp;DAC_CLR_PIN &nbsp; &nbsp; &nbsp; &nbsp;GPIO_PIN_13</p>

                        <p align="left" >#define &nbsp;DAC_CLR_H &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HAL_GPIO_WritePin(DAC_CLR_PORT,DAC_CLR_PIN,GPIO_PIN_SET)</p>

                        <p align="left" >#define &nbsp;DAC_CLR_L &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HAL_GPIO_WritePin(DAC_CLR_PORT,DAC_CLR_PIN,GPIO_PIN_RESET)</p>

                        <p align="left" >/*</p>

                        <p align="left" >&nbsp; &nbsp; Channel Selection Range 1~8</p>

                        <p align="left" >&nbsp; &nbsp; Value Range 0~65535</p>

                        <p align="left" >*/</p>

                        <p align="left" >void DAC_Init(void);</p>

                        <p align="left" >void DAC_Write(uint8_t channel,uint16_t Value);</p>

                        <p align="left" >#endif</p>

                        <p align="left" >&nbsp;</p>

                        <p >&nbsp;</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为是拷贝之前STM32的驱动,所以还要进行一些修改,先不管。</p>

<p > &nbsp;</p>

<p align="center" >图3:在User里面添加驱动</p>

<p align="center" > &nbsp;</p>

<p align="center" >图4:添加头文件路径1</p>

<p align="center" > &nbsp;</p>

<p align="center" >图5:添加头文件路径2</p>

<p >因为是修改STM32的驱动,其本质没有啥差别,从<a href="https://bbs.eeworld.com.cn/thread-1225595-1-1.html" style="color:blue; text-decoration:underline" target="_blank">RT1052(2)工具生成代码</a> 那个章节直接copy代码过来就行。</p>

<p >Bsp_lpspi.c文件</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black" valign="top">
                        <p >#include &quot;fsl_iomuxc.h&quot;</p>

                        <p >#include &quot;fsl_gpio.h&quot;</p>

                        <p >#include &quot;fsl_lpspi.h&quot;</p>

                        <p >#include &quot;pad_config.h&quot;</p>

                        <p >#include &quot;bsp_lpspi.h&quot;</p>

                        <p >&nbsp;</p>

                        <p >&nbsp;</p>

                        <p >static void LPSPI_GPIO_Init(void);</p>

                        <p >&nbsp;</p>

                        <p >static void LPSPI_GPIO_Init(void)</p>

                        <p >{</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp; IOMUXC_SetPinMux(</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOMUXC_GPIO_AD_B0_00_LPSPI3_SCK,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* GPIO_AD_B0_00 is configured as LPSPI3_SCK */</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0U);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Software Input On Field: Input Path is determined by functionality */</p>

                        <p >&nbsp; IOMUXC_SetPinMux(</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOMUXC_GPIO_AD_B0_01_LPSPI3_SDO,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* GPIO_AD_B0_01 is configured as LPSPI3_SDO */</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0U);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Software Input On Field: Input Path is determined by functionality */</p>

                        <p >&nbsp; IOMUXC_SetPinMux(</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOMUXC_GPIO_AD_B0_02_LPSPI3_SDI,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* GPIO_AD_B0_02 is configured as LPSPI3_SDI */</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0U);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Software Input On Field: Input Path is determined by functionality */</p>

                        <p >&nbsp; IOMUXC_SetPinMux(</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOMUXC_GPIO_AD_B0_03_LPSPI3_PCS0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* GPIO_AD_B0_03 is configured as LPSPI3_PCS0 */</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0U);</p>

                        <p >}</p>

                        <p >void LPSPI_Init(void)</p>

                        <p >{</p>

                        <p >&nbsp;&nbsp;&nbsp; //config Lpspi clock</p>

                        <p >&nbsp;&nbsp;&nbsp; CLOCK_SetMux(kCLOCK_LpspiMux, 3);</p>

                        <p >&nbsp;&nbsp;&nbsp; CLOCK_SetDiv(kCLOCK_LpspiDiv, 7U);</p>

                        <p >&nbsp;&nbsp;&nbsp; //initial Gpio config</p>

                        <p >&nbsp;&nbsp;&nbsp; LPSPI_GPIO_Init();</p>

                        <p >&nbsp;&nbsp;&nbsp; //initial lpspi config</p>

                        <p >&nbsp;&nbsp;&nbsp; lpspi_master_config_t config;</p>

                        <p >&nbsp;</p>

                        <p >&nbsp;&nbsp;&nbsp; LPSPI_MasterGetDefaultConfig(&amp;config);</p>

                        <p >&nbsp;&nbsp;&nbsp; //config lpspi cs pin</p>

                        <p >&nbsp;&nbsp;&nbsp; config.whichPcs=kLPSPI_Pcs0;</p>

                        <p >&nbsp;</p>

                        <p >&nbsp;&nbsp;&nbsp; LPSPI_MasterInit(LPSPI3, &amp;config, LPSPI3_CLOCK_FREQ);</p>

                        <p >}</p>

                        <p >void Lpspi_Write(uint8_t datasize,uint8_t *data)</p>

                        <p >{</p>

                        <p >&nbsp;&nbsp;&nbsp; lpspi_transfer_t spi_tranxfer;</p>

                        <p >&nbsp;&nbsp;&nbsp; spi_tranxfer.configFlags=kLPSPI_MasterPcs0|kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap;</p>

                        <p >&nbsp;&nbsp;&nbsp; spi_tranxfer.txData=data; //要发送的数据</p>

                        <p >&nbsp;&nbsp;&nbsp; spi_tranxfer.rxData=NULL;</p>

                        <p >&nbsp;&nbsp;&nbsp; spi_tranxfer.dataSize=datasize; //数据长度</p>

                        <p >&nbsp;&nbsp;&nbsp; LPSPI_MasterTransferBlocking(LPSPI3, &amp;spi_tranxfer);</p>

                        <p >}</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >Bsp_lpspi.h文件</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black" valign="top">
                        <p >#ifndef __BSP_LPSPI_H</p>

                        <p >#define __BSP_LPSPI_H</p>

                        <p >&nbsp;</p>

                        <p >#include &quot;fsl_common.h&quot;</p>

                        <p >&nbsp;</p>

                        <p >&nbsp;</p>

                        <p >&nbsp;</p>

                        <p >#define LPSPI3_CLOCK_FREQ 6000000UL</p>

                        <p >&nbsp;</p>

                        <p >&nbsp;</p>

                        <p >void LPSPI_Init(void);</p>

                        <p >void DAC_Write(uint8_t channel,uint16_t Value);</p>

                        <p >&nbsp;</p>

                        <p >#endif /* __BSP_LPSPI_H */</p>

                        <p >&nbsp;</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >Github 地址:</p>

<p >https://github.com/xutong-analog/fantasy/tree/main/RT1052/lpspi</p>

<p >测试下驱动波形</p>

<p > &nbsp;</p>

<p align="center" >图6:lpspi驱动波形</p>

<p >再给AD5668套层壳</p>

<p >AD5668.C</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black" valign="top">
                        <p >#include &quot;AD5668.h&quot;</p>

                        <p >#include &quot;board.h&quot;</p>

                        <p >/*</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Channel Selection Range 1~16</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Value Range 0~65535</p>

                        <p >*/</p>

                        <p >void DAC_Write(uint8_t channel,uint16_t Value)</p>

                        <p >{</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t data;</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data=WriteAndUpDateCh;</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data=(Value&gt;&gt;12)|channel;</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data=(Value&gt;&gt;4)&amp;0x00ff;</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data=(Value&amp;0x000f)&lt;&lt;4;</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lpspi_Write(4,data);</p>

                        <p >&nbsp;</p>

                        <p >}</p>

                        <p >/*</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Initial DAC GPIO</p>

                        <p >*/</p>

                        <p >void DAC_Init(void)</p>

                        <p >{</p>

                        <p >&nbsp;</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //DAC_CLR_L;</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* OPEN INTERANL REFERENCE */</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t data={0x08,0xf0,0x00,0x01};</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lpspi_Write(4,data);</p>

                        <p >&nbsp;</p>

                        <p >}</p>

                        <p >&nbsp;</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >AD5668.H</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black" valign="top">
                        <p >#ifndef __AD5668_H</p>

                        <p >#define __AD5668_H</p>

                        <p >#include &quot;bsp_lpspi.h&quot;</p>

                        <p >/*</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AD5668 COMMAND AND ADDRESS</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MSB</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31 30 29 28&nbsp; 27 26 25 24</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X&nbsp;&nbsp; X&nbsp; X&nbsp; X&nbsp; C3 C2 C1 C0</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23 22 21 20&nbsp; 19 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A3 A2 A1 A0&nbsp; Data Msb-&gt; DataLSB</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 3 2 1</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X X X X</p>

                        <p >*/</p>

                        <p >/*</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMAND</p>

                        <p >*/</p>

                        <p >#define&nbsp; UpdateDacReg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0X01</p>

                        <p >#define&nbsp; WriteAndUpDateCh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>

                        <p >#define&nbsp;&nbsp; ResetDac&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x07</p>

                        <p >#define&nbsp;&nbsp; SetUpRef&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x80</p>

                        <p >/*</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADDRESS&nbsp;</p>

                        <p >*/</p>

                        <p >#define&nbsp; ChannelA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0X00</p>

                        <p >#define&nbsp; ChannelB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0X10</p>

                        <p >#define&nbsp; ChannelC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0X20</p>

                        <p >#define&nbsp; ChannelD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0X30</p>

                        <p >#define&nbsp; ChannelE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0X40</p>

                        <p >#define&nbsp; ChannelF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0X50</p>

                        <p >#define&nbsp; ChannelG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0X60</p>

                        <p >#define&nbsp; ChannelH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0X70</p>

                        <p >#define&nbsp; ChannelAll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0XF0</p>

                        <p >/*</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl GPIO redefine</p>

                        <p >*/</p>

                        <p >#define&nbsp; DAC_CS1_L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SF_NSS1_L</p>

                        <p >#define&nbsp; DAC_CS1_H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SF_NSS1_H</p>

                        <p >&nbsp;</p>

                        <p >#define&nbsp; DAC_CLR_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPIO_PIN_13</p>

                        <p >#define&nbsp;&nbsp; DAC_CLR_H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HAL_GPIO_WritePin(DAC_CLR_PORT,DAC_CLR_PIN,GPIO_PIN_SET)</p>

                        <p >#define&nbsp;&nbsp; DAC_CLR_L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HAL_GPIO_WritePin(DAC_CLR_PORT,DAC_CLR_PIN,GPIO_PIN_RESET)</p>

                        <p >&nbsp;</p>

                        <p >&nbsp;</p>

                        <p >&nbsp;</p>

                        <p >&nbsp;</p>

                        <p >/*</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Channel Selection Range 1~8</p>

                        <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Value Range 0~65535</p>

                        <p >*/</p>

                        <p >void DAC_Init(void);</p>

                        <p >void DAC_Write(uint8_t channel,uint16_t Value);</p>

                        <p >&nbsp;</p>

                        <p >#endif</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >掏出开发板</p>

<p > &nbsp;</p>

<p align="center" >图7:DAC开发板</p>

<p > &nbsp;</p>

<p align="center" >图8:DAC输出结果</p>

<p align="center" > &nbsp;</p>

<p align="center" >图9:测试环境</p>

<h2 >参考文档:</h2>

<p >Eeworld <a href="https://bbs.eeworld.com.cn/thread-1230425-1-1.html" style="color:blue; text-decoration:underline" target="_blank">10*10的洞洞板</a>&mdash;xutong</p>

<p >Eeworld <a href="https://bbs.eeworld.com.cn/thread-1225595-1-1.html" style="color:blue; text-decoration:underline" target="_blank">RT1052(2)工具生成代码</a> &mdash;xutong</p>

<p >Adi ad5668 datasheet</p>

<p >&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

xutong 发表于 2023-1-10 12:16

<div></div>

xutong 发表于 2023-1-10 14:22

<p>https://github.com/xutong-analog/fantasy/tree/main/RT1052</p>

<p>github地址</p>

xutong 发表于 2023-2-3 14:32

<p>更新驱动代码:</p>

<pre>
<code class="language-cpp">#include "AD5668.h"
#include "board.h"
#include "bsp_lpspi.h"
/*
        Channel Selection Range 1~16
        Value Range 0~65535
*/
void DAC_Write(uint8_t channel,uint16_t Value)
{
    uint8_t data;
   //command modify
    data=WriteToReg;
    //WriteAndUpDateCh
    // command modify
    data=(Value&gt;&gt;12)|channel;
    data=(Value&gt;&gt;4)&amp;0x00ff;
    data=(Value&amp;0x000f)&lt;&lt;4;
   
    Lpspi_Write(4,data);

}
void DAC_Command_Write(uint8_t Command,uint8_t channel,uint16_t Value)
{
    uint8_t data;
   //command modify
    data=Command;
    //WriteAndUpDateCh
    // command modify
    data=(Value&gt;&gt;12)|channel;
    data=(Value&gt;&gt;4)&amp;0x00ff;
    data=(Value&amp;0x000f)&lt;&lt;4;
   
    Lpspi_Write(4,data);

}
/*
        Initial DAC GPIO
*/
void DAC_Init(void)
{

    //DAC_CLR_L;                                                                                                                                                                                                                                                                                                                                                                                                                     
    /* OPEN INTERANL REFERENCE */
    uint8_t data={0x08,0xf0,0x00,0x01};
    Lpspi_Write(4,data);

}
void DAC_Reset(void)
{
    // no significance data
    uint8_t data={0x00,0xf0,0x00,0x01};
   //command modify
    data=ResetDac;
    Lpspi_Write(4,data);

}
void SoftLdac(void)
{
   
    uint8_t data={0x06,0x00,0x00,0xFF};
    Lpspi_Write(4,data);

}</code></pre>

<p>&nbsp;</p>

<pre>
<code class="language-cpp">#ifndef __AD5668_H
#define __AD5668_H
#include "bsp_lpspi.h"
/*
        AD5668 COMMAND AND ADDRESS
        MSB
        31 30 29 2827 26 25 24
        X   XXXC3 C2 C1 C0
        23 22 21 2019                 -&gt;                 5
        A3 A2 A1 A0Data Msb-&gt; DataLSB
        4 3 2 1
        X X X X
*/
/*
        COMMAND
*/
#defineWriteToReg                                0X00
#defineUpdateDacReg                                0X01
#defineWriteAndUpDateAll                        0X02
#defineWriteAndUpDateCh                        0x03       
#definePowerDownAndPowerUpDac                        0x04
#defineloadClearReg                              0x05
#defineloadLdacReg                              0x06
#define       ResetDac                                0x07
#define       SetUpRef                                0x80
/*
        ADDRESS
*/
#defineChannelA                                                0X00
#defineChannelB                                                0X10
#defineChannelC                                                0X20
#defineChannelD                                                0X30
#defineChannelE                                                0X40
#defineChannelF                                                0X50
#defineChannelG                                                0X60
#defineChannelH                                                0X70
#defineChannelAll                                        0XF0
/*
        Ctrl GPIO redefine
*/
#defineDAC_CS1_L                        SF_NSS1_L
#defineDAC_CS1_H                        SF_NSS1_H

#defineDAC_CLR_PIN                        GPIO_PIN_13
#define       DAC_CLR_H                        HAL_GPIO_WritePin(DAC_CLR_PORT,DAC_CLR_PIN,GPIO_PIN_SET)
#define       DAC_CLR_L                        HAL_GPIO_WritePin(DAC_CLR_PORT,DAC_CLR_PIN,GPIO_PIN_RESET)




/*
        Channel Selection Range 1~8
        Value Range 0~65535
*/
void DAC_Init(void);
void DAC_Write(uint8_t channel,uint16_t Value);
void DAC_Command_Write(uint8_t Command,uint8_t channel,uint16_t Value);
void DAC_Reset(void);
void SoftLdac(void);
#endif
</code></pre>

<p>&nbsp;</p>

xutong 发表于 2023-2-11 15:18

<p>再次更新驱动代码:</p>

<pre>
<code>#include "fsl_iomuxc.h"
#include "fsl_gpio.h"
#include "fsl_lpspi.h"
#include "pad_config.h"
#include "bsp_lpspi.h"


static void LPSPI_GPIO_Init(void);

static void LPSPI_GPIO_Init(void)
{
   IOMUXC_SetPinMux(
      IOMUXC_GPIO_AD_B0_00_LPSPI3_SCK,      /* GPIO_AD_B0_00 is configured as LPSPI3_SCK */
      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
IOMUXC_SetPinMux(
      IOMUXC_GPIO_AD_B0_01_LPSPI3_SDO,      /* GPIO_AD_B0_01 is configured as LPSPI3_SDO */
      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
IOMUXC_SetPinMux(
      IOMUXC_GPIO_AD_B0_02_LPSPI3_SDI,      /* GPIO_AD_B0_02 is configured as LPSPI3_SDI */
      0U);                                    /* Software Input On Field: Input Path is determined by functionality */                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
IOMUXC_SetPinMux(
      IOMUXC_GPIO_AD_B0_03_LPSPI3_PCS0,       /* GPIO_AD_B0_03 is configured as LPSPI3_PCS0 */
      0U);
}
void LPSPI_Init(void)
{
    //config Lpspi clock
    CLOCK_SetMux(kCLOCK_LpspiMux, 3);
    CLOCK_SetDiv(kCLOCK_LpspiDiv, 7U);
    //initial Gpio config
    LPSPI_GPIO_Init();
    //initial lpspi config
    lpspi_master_config_t config;

    LPSPI_MasterGetDefaultConfig(&amp;config);
    //config lpspi cs pin
    config.whichPcs=kLPSPI_Pcs0;
   // config.cpol=kLPSPI_ClockPolarityActiveLow;
    // 使用ADX112 直接使用此配置
    config.cpha=kLPSPI_ClockPhaseSecondEdge;
    LPSPI_MasterInit(LPSPI3, &amp;config, LPSPI3_CLOCK_FREQ);
}
//写数据
void Lpspi_Write(uint8_t datasize,uint8_t *data)
{
    lpspi_transfer_t spi_tranxfer;
    spi_tranxfer.configFlags=kLPSPI_MasterPcs0|kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap;
    spi_tranxfer.txData=data; //要发送的数据
    spi_tranxfer.rxData=NULL;
    spi_tranxfer.dataSize=datasize; //数据长度
    LPSPI_MasterTransferBlocking(LPSPI3, &amp;spi_tranxfer);
}
//读写数据
void Lpspi_Read(uint8_t datasize,uint8_t *data,uint8_t *Rxdata)
{      
    lpspi_transfer_t spi_tranxfer;
    spi_tranxfer.configFlags=kLPSPI_MasterPcs0|kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap;
    spi_tranxfer.txData=data; //要发送的数据
    spi_tranxfer.rxData=Rxdata; //要接收的数据
    spi_tranxfer.dataSize=datasize; //数据长度
    LPSPI_MasterTransferBlocking(LPSPI3, &amp;spi_tranxfer);

}

</code></pre>

<pre>
<code>#ifndef __BSP_LPSPI_H
#define __BSP_LPSPI_H

#include "fsl_common.h"



#define LPSPI3_CLOCK_FREQ 6000000UL


void LPSPI_Init(void);
//xue
void Lpspi_Write(uint8_t datasize,uint8_t *data);
void Lpspi_Read(uint8_t datasize,uint8_t *data,uint8_t *Rxdata);

#endif /* __BSP_LPSPI_H */

</code></pre>

<p>可以直接驱动ADX112</p>

<pre>
<code>/**
******************************************************************************
* @File main.c
* @author fire
* @version V1.0
* @date 2018-xx-xx
* @brief GPIO输入—按键中断检测
******************************************************************************
* @attention *
* 实验平台:野火i.MXRT1052开发板
* 论坛    :http://www.firebbs.cn
* 淘宝    :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "board.h"
#include "fsl_debug_console.h"
#include "fsl_gpio.h"
#include "fsl_gpt.h"
#include "fsl_lpspi.h"
#include "fsl_iomuxc.h"
#include "pad_config.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "fsl_lpi2c.h"
#include "./bsp/nvic/bsp_nvic.h"
#include "./bsp/led/bsp_led.h"
#include "./bsp/key/bsp_key_it.h"
#include "ad5668.h"
#include "fsl_adc.h"

#include "rtthread.h"
#include "bsp_lpspi.h"
#include "bsp_lpi2c.h"
#include "AnalogysemiCSD.h"
// 添加adc的返回值用于打印
volatile uint16_t ADC_Value;

uint8_t datas[]={0x04,0x9A,0x04,0X9A};
uint8_t Rdatas;

/*******************************************************************kkokkkkkkkkkkk
* Prototypes
*******************************************************************/
/**
* @brief 延时一段时间
*/


void delay(uint32_t count);

/*******************************************************************
* Code
*******************************************************************/
/**
* @note 本函数在不同的优化模式下延时时间不同,
*       如flexspi_nor_debug和flexspi_nor_release版本的程序中,
*       flexspi_nor_release版本的延时要短得多
*/
void delay(uint32_t count)
{
    volatile uint32_t i = 0;
    for (i = 0; i &lt; count; ++i)
    {
      __asm("NOP"); /* 调用nop空指令 */
         __asm("NOP"); /* 调用nop空指令 */
          __asm("NOP"); /* 调用nop空指令 */
         __asm("NOP"); /* 调用nop空指令 */
            __asm("NOP"); /* 调用nop空指令 */
    }
}
// 步骤2:新建ADC初始化函数
void RT1052_ADC_Init(void)
{
   adc_config_t adcConfigStruct;
   adc_channel_config_t adcChannelConfigStruct;
      /*
   *config-&gt;enableAsynchronousClockOutput = true;
   *config-&gt;enableOverWrite =               false;
   *config-&gt;enableContinuousConversion =    false;
   *config-&gt;enableHighSpeed =               false;
   *config-&gt;enableLowPower =                false;
   *config-&gt;enableLongSample =            false;
   *config-&gt;referenceVoltageSource =      kADC_ReferenceVoltageSourceVref;
   *config-&gt;samplePeriodMode =            kADC_SamplePeriod2or12Clocks;
   *config-&gt;clockSource =                   kADC_ClockSourceAD;
   *config-&gt;clockDriver =                   kADC_ClockDriver1;
   *config-&gt;resolution =                  kADC_Resolution12Bit;
   */
    ADC_GetDefaultConfig(&amp;adcConfigStruct);
    //最大resolution 12bit 只有外部参考
    //adcConfigStruct.referenceVoltageSource=kADC_ReferenceVoltageSourceAlt0;
    //开启连续转换模式
    adcConfigStruct.enableContinuousConversion=true;
    ADC_Init(ADC1, &amp;adcConfigStruct);
    //开启ADC中断
    EnableIRQ(ADC1_IRQn);
    //开启ADC1 自动校准
    ADC_DoAutoCalibration(ADC1);
    //关闭硬件触发
    ADC_EnableHardwareTrigger(ADC1, false);
    //读取通道0
    adcChannelConfigStruct.channelNumber                        = 0;
   
    adcChannelConfigStruct.enableInterruptOnConversionCompleted = true;
    // Channe_group0 用于软件或者硬件出发
    ADC_SetChannelConfig(ADC1, 0u /*ADC_CHANNEL_GROUP*/, &amp;adcChannelConfigStruct);
      
}
// ADC 中断入口函数
voidADC1_IRQHandler(void)
{
ADC_Value= ADC_GetChannelConversionValue(ADC1, 0U);
rt_kprintf("ADC_Value :%d\r\n",ADC_Value);

}


/**
* @brief主函数
* @param无
* @retval 无
*/



int main(void)
{
   // uint16_t BusVoltage;
    rt_kprintf("hello analogysemi \r\n");       
    User_GPIO_Init();
    LPSPI_Init();

    Lpspi_Read(4,datas,Rdatas);
    while(1)
    {


         Lpspi_Read(4,datas,Rdatas);
      rt_thread_mdelay(10);
         Lpspi_Read(4,datas,Rdatas);
      rt_thread_mdelay(10);

    }   

}


/*********************************************END OF FILE**********************/




</code></pre>

<p>ADX112 测温结果输出</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

xutong 发表于 2023-4-19 16:35

<pre>
<code class="language-cpp">/**
******************************************************************************
* @File main.c
* @author fire
* @version V1.0
* @date 2018-xx-xx
* @brief GPIO输入—按键中断检测
******************************************************************************
* @attention *
* 实验平台:野火i.MXRT1052开发板
* 论坛    :http://www.firebbs.cn
* 淘宝    :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "board.h"
#include "fsl_debug_console.h"
#include "fsl_gpio.h"
#include "fsl_gpt.h"
#include "fsl_lpspi.h"
#include "fsl_iomuxc.h"
#include "pad_config.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "fsl_lpi2c.h"
#include "./bsp/nvic/bsp_nvic.h"
#include "./bsp/led/bsp_led.h"
#include "./bsp/key/bsp_key_it.h"
#include "ad5668.h"
#include "fsl_adc.h"

#include "rtthread.h"
#include "bsp_lpspi.h"
// 添加adc的返回值用于打印
volatile uint16_t ADC_Value;

/*******************************************************************kkokkkkkkkkkkk
* Prototypes
*******************************************************************/
/**
* @brief 延时一段时间
*/


void delay(uint32_t count);

/*******************************************************************
* Code
*******************************************************************/
/**
* @note 本函数在不同的优化模式下延时时间不同,
*       如flexspi_nor_debug和flexspi_nor_release版本的程序中,
*       flexspi_nor_release版本的延时要短得多
*/
void delay(uint32_t count)
{
    volatile uint32_t i = 0;
    for (i = 0; i &lt; count; ++i)
    {
      __asm("NOP"); /* 调用nop空指令 */
         __asm("NOP"); /* 调用nop空指令 */
          __asm("NOP"); /* 调用nop空指令 */
         __asm("NOP"); /* 调用nop空指令 */
            __asm("NOP"); /* 调用nop空指令 */
    }
}
// 步骤2:新建ADC初始化函数
void RT1052_ADC_Init(void)
{
   adc_config_t adcConfigStruct;
   adc_channel_config_t adcChannelConfigStruct;
      /*
   *config-&gt;enableAsynchronousClockOutput = true;
   *config-&gt;enableOverWrite =               false;
   *config-&gt;enableContinuousConversion =    false;
   *config-&gt;enableHighSpeed =               false;
   *config-&gt;enableLowPower =                false;
   *config-&gt;enableLongSample =            false;
   *config-&gt;referenceVoltageSource =      kADC_ReferenceVoltageSourceVref;
   *config-&gt;samplePeriodMode =            kADC_SamplePeriod2or12Clocks;
   *config-&gt;clockSource =                   kADC_ClockSourceAD;
   *config-&gt;clockDriver =                   kADC_ClockDriver1;
   *config-&gt;resolution =                  kADC_Resolution12Bit;
   */
    ADC_GetDefaultConfig(&amp;adcConfigStruct);
    //最大resolution 12bit 只有外部参考
    //adcConfigStruct.referenceVoltageSource=kADC_ReferenceVoltageSourceAlt0;
    //开启连续转换模式
    adcConfigStruct.enableContinuousConversion=true;
    ADC_Init(ADC1, &amp;adcConfigStruct);
    //开启ADC中断
    EnableIRQ(ADC1_IRQn);
    //开启ADC1 自动校准
    ADC_DoAutoCalibration(ADC1);
    //关闭硬件触发
    ADC_EnableHardwareTrigger(ADC1, false);
    //读取通道0
    adcChannelConfigStruct.channelNumber                        = 0;
   
    adcChannelConfigStruct.enableInterruptOnConversionCompleted = true;
    // Channe_group0 用于软件或者硬件出发
    ADC_SetChannelConfig(ADC1, 0u /*ADC_CHANNEL_GROUP*/, &amp;adcChannelConfigStruct);
      
}
// ADC 中断入口函数
voidADC1_IRQHandler(void)
{
ADC_Value= ADC_GetChannelConversionValue(ADC1, 0U);
rt_kprintf("ADC_Value :%d\r\n",ADC_Value);

}



/**
* @brief主函数
* @param无
* @retval 无
*/


int main(void)
{

    rt_kprintf("hello analogysemi \r\n");       
    User_GPIO_Init();
    LPSPI_Init();
//    RT1052_ADC_Init();
//      //读取通道0
//    adc_channel_config_t adcChannelConfigStruct;
//    adcChannelConfigStruct.channelNumber                        = 0;
//    adcChannelConfigStruct.enableInterruptOnConversionCompleted = true;
   DAC_Init();
   rt_thread_mdelay(1);
    while(1)
    {
//      RGB_RED_LED_ON;
//

    DAC_Write(ChannelA,0x55aa);
         rt_thread_mdelay(10);
   DAC_Write(ChannelA,0xaa55);

   rt_thread_mdelay(10);
   
//       ADC_SetChannelConfig(ADC1, 0u /*ADC_CHANNEL_GROUP*/, &amp;adcChannelConfigStruct);
//      rt_thread_mdelay(500);
    }   

}


/*********************************************END OF FILE**********************/




</code></pre>

<p>主程序</p>

freebsder 发表于 2023-4-21 23:19

<p>这个波形看起来不太干净呢?</p>

xutong 发表于 2023-4-22 09:33

freebsder 发表于 2023-4-21 23:19
这个波形看起来不太干净呢?

<p>线飞来飞去,接地没夹好</p>

freebsder 发表于 2023-4-24 09:24

xutong 发表于 2023-4-22 09:33
线飞来飞去,接地没夹好

<p>哈哈,好吧</p>

xutong 发表于 2023-4-24 11:05

freebsder 发表于 2023-4-24 09:24
哈哈,好吧

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" />快速验下,快速搞下个东西</p>

xutong 发表于 2023-10-19 14:52

<pre>
<code class="language-cpp">/*
analogysemi
xutong 2023/10/19
*/
#ifndef __BSP_LPSPI_H
#define __BSP_LPSPI_H

#include "stm32h7xx_hal.h"


#define SPIx                           SPI1
#define SPIx_CLK_ENABLE()                __HAL_RCC_SPI1_CLK_ENABLE()
#define SPIx_SCK_GPIO_CLK_ENABLE()       __HAL_RCC_GPIOB_CLK_ENABLE()
#define SPIx_MISO_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
#define SPIx_MOSI_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()

#define SPIx_CS_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
/* Definition for SPIx Pins */
#define SPIx_SCK_PIN                     GPIO_PIN_3
#define SPIx_SCK_GPIO_PORT               GPIOB
#define SPIx_SCK_AF                      GPIO_AF5_SPI1
#define SPIx_MISO_PIN                  GPIO_PIN_4
#define SPIx_MISO_GPIO_PORT            GPIOB
#define SPIx_MISO_AF                     GPIO_AF5_SPI1
#define SPIx_MOSI_PIN                  GPIO_PIN_5
#define SPIx_MOSI_GPIO_PORT            GPIOB
#define SPIx_MOSI_AF                     GPIO_AF5_SPI1

#define SPIx_CS_PIN                      GPIO_PIN_6
#define SPIx_CS_GPIO_PORT                GPIOB




void LPSPI_Init(void);

void Lpspi_Write(uint8_t datasize,uint8_t *data);
void Lpspi_Read(uint8_t datasize,uint8_t *data,uint8_t *Rxdata);

#endif /* __BSP_LPSPI_H */</code></pre>

<pre>
<code class="language-cpp">#include "bsp_lpspi.h"
SPI_HandleTypeDef SpiHandle;

void Spi_delay(uint32_t count)
{
    volatile uint32_t i = 0;
    for (i = 0; i &lt; count; ++i)
    {
      __asm("NOP"); /* 调用nop空指令 */
         __asm("NOP"); /* 调用nop空指令 */
          __asm("NOP"); /* 调用nop空指令 */
         __asm("NOP"); /* 调用nop空指令 */
            __asm("NOP"); /* 调用nop空指令 */
    }
}
void LPSPI_Init(void)
{
   
    GPIO_InitTypeDefGPIO_InitStruct;
    /* Enable SPI1 clock */
    SPIx_CLK_ENABLE();
    SPIx_SCK_GPIO_CLK_ENABLE();
    SPIx_MISO_GPIO_CLK_ENABLE();
    SPIx_MOSI_GPIO_CLK_ENABLE();
    SPIx_CS_GPIO_CLK_ENABLE();
   
   

    /* 初始化GPIO 配置*/
    /*##-1- Configure peripheral GPIO ##########################################*/
    /* SPI SCK GPIO pin configuration*/
    GPIO_InitStruct.Pin       = SPIx_SCK_PIN;
    GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull      = GPIO_PULLDOWN;
    GPIO_InitStruct.Speed   = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = SPIx_SCK_AF;
    HAL_GPIO_Init(SPIx_SCK_GPIO_PORT, &amp;GPIO_InitStruct);

    /* SPI MISO GPIO pin configuration*/
    GPIO_InitStruct.Pin = SPIx_MISO_PIN;
    GPIO_InitStruct.Alternate = SPIx_MISO_AF;
    HAL_GPIO_Init(SPIx_MISO_GPIO_PORT, &amp;GPIO_InitStruct);

    /* SPI MOSI GPIO pin configuration*/
    GPIO_InitStruct.Pin = SPIx_MOSI_PIN;
    GPIO_InitStruct.Alternate = SPIx_MOSI_AF;
    HAL_GPIO_Init(SPIx_MOSI_GPIO_PORT, &amp;GPIO_InitStruct);
   
   /* SPI CS GPIO pin configuration*/
    GPIO_InitStruct.Pin = SPIx_CS_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull      = GPIO_PULLDOWN;
    GPIO_InitStruct.Speed   = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(SPIx_CS_GPIO_PORT, &amp;GPIO_InitStruct);
   
      /* 初始化SPI 配置*/
   /*##-2- Configure the SPI peripheral #######################################*/
    /* Set the SPI parameters */
    SpiHandle.Instance               = SPIx;
    SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
    SpiHandle.Init.Direction         = SPI_DIRECTION_2LINES;
    SpiHandle.Init.CLKPhase          = SPI_PHASE_1EDGE;
    SpiHandle.Init.CLKPolarity       = SPI_POLARITY_HIGH;
    SpiHandle.Init.DataSize          = SPI_DATASIZE_8BIT;
    SpiHandle.Init.FirstBit          = SPI_FIRSTBIT_MSB;
    SpiHandle.Init.TIMode            = SPI_TIMODE_DISABLE;
    SpiHandle.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
    SpiHandle.Init.CRCPolynomial   = 7;
    SpiHandle.Init.NSS               = SPI_NSS_SOFT;
    SpiHandle.Init.Mode            = SPI_MODE_MASTER;
    //初始化SPI
    HAL_SPI_Init(&amp;SpiHandle);
    //默认拉高CS引脚
    HAL_GPIO_WritePin(SPIx_CS_GPIO_PORT,SPIx_CS_PIN,GPIO_PIN_SET);

}
void Lpspi_Write(uint8_t datasize,uint8_t *data)
{

//写数据
HAL_GPIO_WritePin(SPIx_CS_GPIO_PORT,SPIx_CS_PIN,GPIO_PIN_RESET);
HAL_SPI_Transmit(&amp;SpiHandle,data, datasize, 5000);
Spi_delay(30);
HAL_GPIO_WritePin(SPIx_CS_GPIO_PORT,SPIx_CS_PIN,GPIO_PIN_SET);
}
void Lpspi_Read(uint8_t datasize,uint8_t *data,uint8_t *Rxdata)
{
//读写数据
HAL_GPIO_WritePin(SPIx_CS_GPIO_PORT,SPIx_CS_PIN,GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&amp;SpiHandle,data,Rxdata, datasize, 5000);
Spi_delay(30);
HAL_GPIO_WritePin(SPIx_CS_GPIO_PORT,SPIx_CS_PIN,GPIO_PIN_SET);
}
</code></pre>

<p>&nbsp;</p>

<p>转换为STM32能用的头文件</p>
页: [1]
查看完整版本: RT1052 (7) 驱动SPI-DAC