查看: 931|回复: 0

​兆易创新GD32 Colibri-F207ZE评估板体验纪实 (六、揭秘)

[复制链接]
  • TA的每日心情
    无聊
    2018-1-4 09:36
  • 签到天数: 58 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2016-2-18 09:08:29 | 显示全部楼层 |阅读模式
    分享到:
    兆易创新GD32 Colibri-F207ZE评估板体验纪实 (六、揭秘)
    25_okwh@https://www.eeboard.com/gd32f2mcu
       2016.02.17
    关键:
    8位AD5425、16位AD5542、16位DAC7731,用于产生各种动态控制信号,一个24位AD是测量动态信号AD7732。
    按DAC7731说明书要求,可以是16位、8位或连续发送方式,在得到16位数据后,还需要一个LDAC上升沿信号触发真正的DA转换。

    8位AD5425说明书:The AD5425 requires an8-bit word with the default being data valid on the falling edge of SCLK……clockpolarity bit (CPOL) = 0, and the clock phase bit (CPHA) = 1.

    1 AD5425说明书时序图
    向8位AD5425依次发送0x10、0x08、0x04、0x02,图的下部是、0x04的放大细节,可以看出使用上升沿设置,下降沿(放大图中的标志线)接收数据,即每个数字位对应一个先高后低完整时钟周期,即使用模式1。实测结果:






    16位参考DAC7731说明书:The serial data
    is shifted into the device on each rising SCLK edge until all 16 bits aretransferred (1 bit per 1 rising SCLK edge). Once received, the data in theinput register is loaded into the DAC register upon reception of a rising edgeon the LDAC input (load command). This action updates the analog output, VOUT,to the desired voltage specified by the digital input word. A….HIGH, the rising edge on CS must occur whenSCLK is HIGH.

    2 DAC7731 说明书时序图
    16位DAC7731 依次发送0x4000、0xAAAA、0x5555,图的下部是0xAAAA、0x5555的放大细节,图中最下一个数字信号D2是在SPI发送数据完成后通过DIO产生一个脉冲信号LDAC,它的上升沿用于触发DA的转换。可以看出DAC7731的SPI是3模式,即CLK下降沿准备单片机准备数据,上升沿DAC7731接收数据。
    实测结果:

    3 DAC7731实际测量
    16位AD5542说明书:After a high-to-lowtransition on CS, data is shifted synchronously and latched into the inputregister on the rising edge of the serial clock, SCLK. Data is loaded MSB firstin 16-bit words. After 16 data bits have been loaded into the serial inputregister, a low-to-high transition on CS transfers the contents of the shiftregister to the DAC. Data can be loaded to the part only while CS is low. …. an LDAC function that allows the DAC latchto be updated asynchronously by bringing LDAC low after CS goes high.)


    模式0 向16位AD5542依次发送0x4000、0xAAAA、0x5555,图的下部是0x5555、0xAAAA的放大细节,可以看出使用下降沿设置,上升沿(放大图中的标志线)接收数据,即使用模式0。(注:图中片选线、LDAC线没测量)
    实测结果:

    一般情况下DA转换芯片只需要单向通讯,无需读取,所以MISO线其实可以无需使用。AD转换芯片就需要双向通讯了。
    24位AD7732是AD公司出品的SPI高精度双通道AD转换芯片,功能繁多,可根据需要设置使用。我这里需要的是单次转换模式、Chopping使能、获取数据最高速度为2.5KHz(约400 us一个点)左右。

    于是根据说明书信息和上时序图,确定关键通讯规则如下:
    a)模式0
    b)初始化指令0x30 0x91
    c)采样指令 0x38 0x42 ,然后读某输入管脚判断转换完成信号RDY为低,即可SPI发指令0x48 0x00   0x00 0x00 (对应后最后三个字节,MISOI会得到接收的24位AD结果,图中为0x80 03D6)
    实测结果:


    主要代码如下:

    • GPIO_InitPara GPIO_InitStructure;
    •      SPI_InitPara SPI_InitStructure;
    •      uint16_t x;

    • /* Enable Peripheral clock */
    •     RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_GPIOA | RCC_APB2PERIPH_GPIOB | RCC_APB2PERIPH_GPIOC|RCC_APB2PERIPH_GPIOD |RCC_APB2PERIPH_AF , ENABLE);
    •     RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_SPI3,ENABLE);
    •      //PortD IO 5/ 6/11/12/13 设为输出可用于软件模式的片选 上电缺省是浮空输入, 3/   输入,读判断AD转换完成标志等
    •     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_11 | GPIO_PIN_12|GPIO_PIN_13 |GPIO_PIN_6|GPIO_PIN_5
    •     GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
    •     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    •     GPIO_Init(GPIOD,&GPIO_InitStructure);

    •     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_3;
    •     GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IPU;
    •         GPIO_Init(GPIOD,&GPIO_InitStructure);
    • /* Configure SPI3 pins: SCK, MISO and MOSI ----*/
    •      //GD32-Colibri-F207ZE 板 SPI3使用 PB 3/5/4
    •      GPIO_InitStructure.GPIO_Pin = GPIO_PIN_3 | GPIO_PIN_5 ;
    •      GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    •      GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP; // 主SCK MO 备用推挽
    •      GPIO_Init(GPIOB, &GPIO_InitStructure);
    •      /* Confugure MISO pin as Input Floating */
    •        GPIO_InitStructure.GPIO_Pin = GPIO_PIN_4;
    •        GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING; //主MI 浮空输入
    •        GPIO_Init(GPIOB, &GPIO_InitStructure);

    •    /* 配置SPI3 configuration -----主-------*/
    •     SPI_InitStructure.SPI_TransType = SPI_TRANSTYPE_FULLDUPLEX ;    //需根据接发要求修改
    •     SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
    •     SPI_InitStructure.SPI_FrameFormat = SPI_FRAMEFORMAT_8BIT; //需根据接发要求修改
    •     SPI_InitStructure.SPI_SCKPL = SPI_SCKPL_LOW;       //需根据接发模式要求修改
    •     SPI_InitStructure.SPI_SCKPH = SPI_SCKPH_2EDGE;     //需根据接发模式要求修改
    •     SPI_InitStructure.SPI_SWNSSEN = SPI_SWNSS_SOFT;      ///NSS不用-用IO代码片选,或使用自动使用片选 PA15
    •     SPI_InitStructure.SPI_PSC = SPI_PSC_32;   //分频    //需根据接发要求修改
    •     SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;   //需根据接发要求修改
    •     SPI_Init(SPI3, &SPI_InitStructure);
    •     /* DisEnable SPI AND SPI3 CRC calculation */
    •     SPI_CRC_Enable(SPI3, DISABLE);
    •     /* Enable SPI3 */
    •     SPI_Enable(SPI3, ENABLE);
    •     while (1)//5425 DA 8bit
    •     {
    •             //     GPIOD->BOR = GPIO_PIN_11; //DO 用于 软件方式时,根据需要设置片选 或 发送LDAC数据好启动转换
    •     // GPIOD->BCR = GPIO_PIN_11;

    •                      while (SPI_I2S_GetBitState(SPI3, SPI_FLAG_TBE) == RESET){__NOP;}
    •              SPI_I2S_SendData(SPI3, 0x10 );
    •                      while (SPI_I2S_GetBitState(SPI3, SPI_FLAG_RBNE) == RESET){__NOP;}
    •              x = SPI_I2S_ReceiveData( SPI3 );
    •                      while (SPI_I2S_GetBitState(SPI3, SPI_FLAG_TBE) == RESET){__NOP;}
    •              SPI_I2S_SendData(SPI3, 0x08 );
    •                      while (SPI_I2S_GetBitState(SPI3, SPI_FLAG_RBNE) == RESET){__NOP;}
    •              x = SPI_I2S_ReceiveData( SPI3 );
    •                      while (SPI_I2S_GetBitState(SPI3, SPI_FLAG_TBE) == RESET){__NOP;}
    •              SPI_I2S_SendData(SPI3, 0x04 );
    •                      while (SPI_I2S_GetBitState(SPI3, SPI_FLAG_RBNE) == RESET){__NOP;}
    •              x = SPI_I2S_ReceiveData( SPI3 );
    •                      while (SPI_I2S_GetBitState(SPI3, SPI_FLAG_TBE) == RESET){__NOP;}
    •              SPI_I2S_SendData(SPI3, 0x02 );
    •                      while (SPI_I2S_GetBitState(SPI3, SPI_FLAG_RBNE) == RESET){__NOP;}
    •              x = SPI_I2S_ReceiveData( SPI3 );

    •     }
    复制代码
    注意事项:
    a) GD32只有两个SPI,如果需要更多可以通过共用SCK/MI/MO,用IO管脚软件模拟CS的方式实现更多的SPI需要
    b)连接ADDA这类芯片需要的LDAC、RDY等信号可通过IO管脚实现
    c)根据各外设需要,设置合适的SPI_InitStructure,主要是SPI模式、是否全双工、通讯速度分频、每帧位数、是否MSB为起始位、如何处理CS
    本系列:
    兆易创新GD32 Colibri-F207ZE评估板体验纪实 (一、邂逅)
    兆易创新GD32 Colibri-F207ZE评估板体验纪实 (二、初识)
    兆易创新GD32 Colibri-F207ZE评估板体验纪实 (三、定计)
    兆易创新GD32 Colibri-F207ZE评估板体验纪实 (四、筑基)
    兆易创新GD32 Colibri-F207ZE评估板体验纪实 (五、曙光)
    兆易创新GD32 Colibri-F207ZE评估板体验纪实 (六、揭秘)
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 22:55 , Processed in 0.125019 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.