嵌入式开发者社区

标题: 创龙的6748程序谁有啊,能给我发一份吗 [打印本页]

作者: leafy    时间: 2016-9-20 20:48
标题: 创龙的6748程序谁有啊,能给我发一份吗
997627482@qq.com,谢谢各位路过的大大~

作者: 希望缄默    时间: 2016-9-21 08:59
网盘上有部分公开的
作者: leafy    时间: 2016-9-22 09:21
版主您好,我刚接触DSP。想请教您一个问题,28335中有GpioDataRegs.GPADAT.bit.GPIO26 =1语句,可以实现对GPIO口写,有GpioDataRegs.GPADAT.bit.GPIO26可以表示引脚的值,我看到用法是
  1. TempA=(TempA<<1) +  GpioDataRegs.GPADAT.bit.GPIO26
复制代码
,而我现在想把28335换成6748,不知道上面这个语句的功能在6748当中用GPIOPinRead(Add,Num)这个函数怎么实现?(还有就是6748中有这种按位操作的语句吗?)
作者: leafy    时间: 2016-9-22 09:41
版主,6748有没有QQ交流群,视频上的QQ群不存在啊
作者: 希望缄默    时间: 2016-9-22 10:18
leafy 发表于 2016-9-22 09:21
版主您好,我刚接触DSP。想请教您一个问题,28335中有GpioDataRegs.GPADAT.bit.GPIO26 =1语句,可以实现对G ...

ADD 是 GPIO 外设寄存器地址
Num 就是 GPIO 管脚号咯 1-144
作者: 希望缄默    时间: 2016-9-22 10:19
leafy 发表于 2016-9-22 09:41
版主,6748有没有QQ交流群,视频上的QQ群不存在啊

据说被同行举报了
加那个 L138 群就好了
作者: human    时间: 2016-9-22 10:23
OMAPL138 TMS320C6748:227961486、324023586、385134684
作者: leafy    时间: 2016-11-4 14:32
  1. //管脚读取数据函数
  2. void AD7606ReadOneSample(int * buf)
  3. {
  4.         unsigned char j, k;
  5.         unsigned short int TempA, TempB;


  6.         AD7606_CNVST_LOW();
  7.         Delay(0x000A);
  8.         AD7606_CNVST_HIGH();
  9.         Delay(0x0001);



  10.         while(GPIOPinRead(SOC_GPIO_0_REGS,31)==1)
  11.         {

  12.         }

  13.         AD7606_SCS_LOW();

  14.         for(j=0; j<4; j++)
  15.         {
  16.                 TempA=0;
  17.                 TempB=0;

  18.                 for(k=0; k<16; k++)
  19.                 {
  20.                         AD7606_SCK_LOW();

  21.                         TempA=(TempA<<1) + GPIOPinRead(SOC_GPIO_0_REGS,30);
  22.                         TempB=(TempB<<1) + GPIOPinRead(SOC_GPIO_0_REGS,136);

  23.                         AD7606_SCK_HIGH();
  24.                 }

  25.                 buf[j]=(int)TempA;
  26.                 buf[4+j]=(int)TempB;

  27.         }
  28.         AD7606_SCS_HIGH();
  29.         conv_flg=1;
  30. }
复制代码

作者: leafy    时间: 2016-11-4 14:44
上面这段代码是AD7606串行读取函数,AD7606采用AB双通道,ADC转换完成之后将DOUT_A和DOUT_B上的数据存在数据TempA和TempB里,但是整个程序运行速度太慢了,因为我用到了GPIOREAD这个函数,说明如下:
while(GPIOPinRead(SOC_GPIO_0_REGS,31)==1),这时候需要判断GPIO31口(对应于AD7606的BUSY端子)的状态用到了GPIOREAD函数;
TempA=(TempA<<1) + GPIOPinRead(SOC_GPIO_0_REGS,30);
TempB=(TempB<<1) + GPIOPinRead(SOC_GPIO_0_REGS,136);
采用左移的思想将DOU_A、DOUT_B的数据存在TempA和TempB里;
作者: leafy    时间: 2016-11-4 14:55
  1. #define AD7606_BUSY_READ                GpioDataRegs.GPADAT.bit.GPIO26
  2. #define AD7606_DOUTA_READ               GpioDataRegs.GPBDAT.bit.GPIO60
  3. #define AD7606_DOUTB_READ               GpioDataRegs.GPBDAT.bit.GPIO32
  4. while(AD7606_BUSY_READ==1)
  5.         {
  6.                 //delay_us(20);
  7.                 //Busy = AD7606_BUSY_READ;
  8.         }
  9. //BUSY输出高电平,表示转换过程已开始,直到转换过程结束为止,Busy都是高电平,Busy下降沿表示转换数据可供读取。
  10.         AD7606_SCS_LOW;//使能数据传输

  11.         for(j=0; j<4; j++)
  12.         {
  13.                 TempA=0;
  14.                 TempB=0;

  15.                 for(k=0; k<16; k++)//SCK是串行时钟输入,每一个数据是跟着SCK输出的
  16.                 {
  17.                         AD7606_SCK_LOW;//下降沿使DOUT_A和DOUT_B脱离三态,并逐个输出转换结果的最高有效位

  18.                         TempA=(TempA<<1) + AD7606_DOUTA_READ;
  19.                         TempB=(TempB<<1) + AD7606_DOUTB_READ;

  20.                         AD7606_SCK_HIGH;//SCK的上升沿将随后的所有数据位逐个送给串行数据输出DOU_A、DOUT_B。
  21.                 }
  22. //DOUT_A上是V1-V4,分别存在了buf[0]-buf[3];DOUT_B上是V5-V8,分别存在了buf[4]-buf[7]
  23.                 buf[j]=(int)TempA;//强制类型转换,变成了4个字节。
  24.                 buf[4+j]=(int)TempB;

  25.         }
  26.         AD7606_SCS_HIGH;//数据输出禁止
  27.         conv_flg=1;//标志位
  28. }
复制代码

作者: leafy    时间: 2016-11-4 14:56
我想解决最上面提出的速度太慢的问题,能不能不用GPIOREAD函数,而像上面这段28335代码一样,采用GpioDataRegs.GPBDAT.bit.GPIO32这种方式。
作者: leafy    时间: 2016-11-4 16:37
上面的问题已经找到了,MCBSP里说了位操作的方法。不过还有一个问题,DSP6748里FLASH 搬移到RAM 运行的实现方法 有吗?
作者: 希望缄默    时间: 2016-11-4 20:56
leafy 发表于 2016-11-4 16:37
上面的问题已经找到了,MCBSP里说了位操作的方法。不过还有一个问题,DSP6748里FLASH 搬移到RAM 运行的实现 ...


C6748 内部 ROM 有个非常强大的 Bootloader 搬移操作不需要用户应用程序干预

作者: leafy    时间: 2016-12-28 11:23
本帖最后由 leafy 于 2016-12-28 15:52 编辑

/****************************************************************************/
/*                                                                          */
/*          AD7606                C6748                                    */
/*                                                                          */
/*                                                                          */
/****************************************************************************/
// 注意:DSP ports, Shared RAM, UART0, EDMA, SPI0, MMC/SDs,
//       VPIF, LCDC, SATA, uPP, DDR2/mDDR (bus ports), USB2.0, HPI, PRU
//       这些外设使用的时钟来源为 PLL0_SYSCLK2 默认频率为 CPU 频率的二分之一
//       但是,ECAPs, UART1/2, Timer64P2/3, eHRPWMs,McBSPs, McASP0, SPI1
//       这些外设的时钟来源可以在 PLL0_SYSCLK2 和 PLL1_SYSCLK2 中选择
//       通过修改 System Configuration (SYSCFG) Module
//       寄存器 Chip Configuration 3 Register (CFGCHIP3) 第四位 ASYNC3_CLKSRC
//       配置时钟来源
//       (默认值) 0 来源于 PLL0_SYSCLK2
//                  1 来源于 PLL1_SYSCLK2
//       如果不是为了降低功耗,不建议修改这个值,它会影响所有相关外设的时钟频率

#include "TL6748.h"                 // 创龙 DSP6748 开发板相关声明
#include "main.h"
#include "hw_types.h"               // 宏命令
#include "hw_syscfg0_C6748.h"       // 系统配置模块寄存器
#include "soc_C6748.h"              // DSP C6748 外设寄存器
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
#include "timer.h"                  // 通用输入输出口宏及设备抽象层函数声明
#include "interrupt.h"              // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义

/****************************************************************************/
/*                                                                          */
/*              宏定义                                                      */
/*                                                                          */
/****************************************************************************/
#define PINMUX2_GPIO1_14_ENABLE    (SYSCFG_PINMUX2_PINMUX2_7_4_GPIO1_14     << \
                                    SYSCFG_PINMUX2_PINMUX2_7_4_SHIFT)

#define PINMUX2_GPIO1_13_ENABLE    (SYSCFG_PINMUX2_PINMUX2_11_8_GPIO1_13     << \
                                    SYSCFG_PINMUX2_PINMUX2_11_8_SHIFT)

#define PINMUX2_GPIO1_12_ENABLE    (SYSCFG_PINMUX2_PINMUX2_15_12_GPIO1_12     << \
                                    SYSCFG_PINMUX2_PINMUX2_15_12_SHIFT)

#define PINMUX2_GPIO1_11_ENABLE    (SYSCFG_PINMUX2_PINMUX2_19_16_GPIO1_11     << \
                                    SYSCFG_PINMUX2_PINMUX2_19_16_SHIFT)

#define PINMUX2_GPIO1_10_ENABLE    (SYSCFG_PINMUX2_PINMUX2_23_20_GPIO1_10     << \
                                    SYSCFG_PINMUX2_PINMUX2_23_20_SHIFT)

#define PINMUX2_GPIO1_9_ENABLE    (SYSCFG_PINMUX2_PINMUX2_27_24_GPIO1_9    << \
                                    SYSCFG_PINMUX2_PINMUX2_27_24_SHIFT)

#define PINMUX2_GPIO8_7_ENABLE    (SYSCFG_PINMUX2_PINMUX2_31_28_GPIO8_7    << \
                                    SYSCFG_PINMUX2_PINMUX2_31_28_SHIFT)
// 64位 定时器 / 计数器周期
// 定时时间 200微秒
// 低32位
#define TMR_PERIOD_LSB32  (0xB220)
// 高32位 0
#define TMR_PERIOD_MSB32  (0)
/****************************************************************************/
/*                                                                          */
/*              全局变量                                                    */
/*                                                                          */
/****************************************************************************/
#define  Num 256
int DOUT[8];
int h;
float AdcSample[8];
float CH1_Sample[Num];
float CH2_Sample[Num];
float CH3_Sample[Num];
float CH4_Sample[Num];
float CH5_Sample[Num];
float CH6_Sample[Num];
float CH7_Sample[Num];
float CH8_Sample[Num];
unsigned short int adc_cnt=0;
int conv_flg=0;
/****************************************************************************/
/*                                                                          */
/*              函数声明                                                    */
/*                                                                          */
/****************************************************************************/
// 外设使能配置
void PSCInit(void);
// GPIO 管脚复用配置
void GPIOBankPinMuxSet();
// GPIO 管脚初始化
void GPIOBankPinInit();
// 定时器 / 计数器初始化
void TimerInit(void);
// 定时器 / 计数器中断初始化
void TimerInterruptInit(void);
// DSP 中断初始化
void InterruptInit(void);
// 中断服务函数
void TimerIsr(void);
// 延时函数
void Delay(volatile unsigned int count);
//PINMUX函数
void GPIOBank1Pin14PinMuxSetup(void);
void GPIOBank1Pin13PinMuxSetup(void);
void GPIOBank1Pin12PinMuxSetup(void);
void GPIOBank1Pin11PinMuxSetup(void);
void GPIOBank1Pin10PinMuxSetup(void);
void GPIOBank1Pin9PinMuxSetup(void);
void GPIOBank8Pin7PinMuxSetup(void);
//管脚输出函数
void AD7606_SCK_LOW(void);
void AD7606_SCK_HIGH(void);
void AD7606_RST_LOW(void);
void AD7606_RST_HIGH(void);
void AD7606_CNVST_LOW(void);
void AD7606_CNVST_HIGH(void);
void AD7606_SCS_LOW(void);
void AD7606_SCS_HIGH(void);
//管脚读取数据函数
void AD7606ReadOneSample(int * buf);
//AD7606复位函数
void AD7606Reset(void);
/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/


作者: leafy    时间: 2016-12-28 11:30
本帖最后由 leafy 于 2016-12-28 14:50 编辑

int main(void)
{
        int i;
        // 外设使能配置
        PSCInit();
       
        // GPIO 管脚复用配置
        GPIOBankPinMuxSet();

        // GPIO 管脚初始化
        GPIOBankPinInit();

        // 定时器 / 计数器初始化
        TimerInit();

        // DSP 中断初始化
        InterruptInit();

        // 定时器 / 计数器中断初始化
        TimerInterruptInit();

        //AD7606初始化
        AD7606Reset();

        // 主循环
         for(; ;)
            {
                  if(conv_flg==1)//一个sample已经被读完,存在了DOUT[0]-DOUT[7]当中,都是int型的数据。
                   {
                      for(i=0;i<8;i++)
                         AdcSample = (20.0/65536.0)* DOUT;//数字量转换为模拟量,输入范围是正负10V,精度为16位
                                                                //相当于将20V分成了65536份,公式为A=(20.0/65536.0)*D;A为模拟量值,D为数字量值;
                                                                //如果输入范围是正负5V则公式为A=(10.0/65536.0)*D
                          conv_flg=0;

                          CH1_Sample[adc_cnt] = AdcSample[0];//存放每个通道的历史数值
                          CH2_Sample[adc_cnt] = AdcSample[1];
                          CH3_Sample[adc_cnt] = AdcSample[2];
                          CH4_Sample[adc_cnt] = AdcSample[3];
                          CH5_Sample[adc_cnt] = AdcSample[4];
                          CH6_Sample[adc_cnt] = AdcSample[5];
                          CH7_Sample[adc_cnt] = AdcSample[6];
                          CH8_Sample[adc_cnt] = AdcSample[7];
                          adc_cnt++;

/*          if(adc_cnt>Num-1)
                               {
                                 for(h=0;h<256;h++)
                                         CH1_Sample[h]=0;
                                     adc_cnt=0;
                               }
*/
                       }
                   }
}
/*        while(1)
        {
                //一个sample已经被读完,存在了DOUT[0]-DOUT[7]当中,都是int型的数据。
                          if(conv_flg==1)
                           {
                              for(i=0;i<8;i++)
                              AdcSample = (20.0/65536.0)* DOUT;
                                  CH1_Sample[adc_cnt] = AdcSample[0];  
                                  CH2_Sample[adc_cnt] = AdcSample[1];
                                  CH3_Sample[adc_cnt] = AdcSample[2];
                                  CH4_Sample[adc_cnt] = AdcSample[3];
                                  CH5_Sample[adc_cnt] = AdcSample[4];
                                  CH6_Sample[adc_cnt] = AdcSample[5];
                                  CH7_Sample[adc_cnt] = AdcSample[6];
                                  CH8_Sample[adc_cnt] = AdcSample[7];
                                  adc_cnt++;
                                  conv_flg=0;
                                  if(adc_cnt>255)
                                          adc_cnt=0;

                           }
    }
    */

/****************************************************************************/
/*                                                                          */
/*              PSC 初始化                                                  */
/*                                                                          */
/****************************************************************************/
void PSCInit(void)
{
        // 使能 GPIO 模块
        // 对相应外设模块的使能也可以在 BootLoader 中完成
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}

/****************************************************************************/
/*                                                                          */
/*              GPIO 管脚复用配置                                           */
/*                                                                          */
/****************************************************************************/
void GPIOBankPinMuxSet(void)
{
        // 配置相应的7个 GPIO 口功能为普通输入输出口

        GPIOBank1Pin14PinMuxSetup();
        GPIOBank1Pin13PinMuxSetup();
        GPIOBank1Pin12PinMuxSetup();
        GPIOBank1Pin11PinMuxSetup();
        GPIOBank1Pin10PinMuxSetup();
        GPIOBank1Pin9PinMuxSetup();
        GPIOBank8Pin7PinMuxSetup();
}

/****************************************************************************/
/*                                                                          */
/*              GPIO 管脚初始化                                             */
/*                                                                          */
/****************************************************************************/
void GPIOBankPinInit(void)
{
    // OMAPL138 及 DSP C6748 共有 144 个 GPIO
        // 以下为各组 GPIO BANK 起始管脚对应值
    // 范围 1-144
        // GPIO0[0] 1
    // GPIO1[0] 17
        // GPIO2[0] 33
    // GPIO3[0] 49
        // GPIO4[0] 65
    // GPIO5[0] 81
        // GPIO6[0] 97
        // GPIO7[0] 113
        // GPIO8[0] 129

    GPIODirModeSet(SOC_GPIO_0_REGS, 31, GPIO_DIR_INPUT);  // GPIO1[14]
    GPIODirModeSet(SOC_GPIO_0_REGS, 30, GPIO_DIR_INPUT);  // GPIO1[13]
    GPIODirModeSet(SOC_GPIO_0_REGS, 136, GPIO_DIR_INPUT);  // GPIO8[7]
    GPIODirModeSet(SOC_GPIO_0_REGS, 29, GPIO_DIR_OUTPUT);  // GPIO1[12]
    GPIODirModeSet(SOC_GPIO_0_REGS, 28, GPIO_DIR_OUTPUT);  // GPIO1[11]
    GPIODirModeSet(SOC_GPIO_0_REGS, 27, GPIO_DIR_OUTPUT);  // GPIO1[10]
    GPIODirModeSet(SOC_GPIO_0_REGS, 26, GPIO_DIR_OUTPUT);  // GPIO1[9]
}

/****************************************************************************/
/*                                                                          */
/*              定时器 / 计数器初始化                                       */
/*                                                                          */
/****************************************************************************/
void TimerInit(void)
{
    // 配置 定时器 / 计数器 2 为 64 位模式
    TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT);

    // 设置周期
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, TMR_PERIOD_LSB32);
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);

    // 使能 定时器 / 计数器 2
    TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONT);
}

/****************************************************************************/
/*                                                                          */
/*              定时器 / 计数器中断初始化                                   */
/*                                                                          */
/****************************************************************************/
void TimerInterruptInit(void)
{
        // 注册中断服务函数
        IntRegister(C674X_MASK_INT4, TimerIsr);

        // 映射中断到 DSP 可屏蔽中断
        IntEventMap(C674X_MASK_INT4, SYS_INT_T64P2_TINTALL);

        // 使能 DSP 可屏蔽中断
        IntEnable(C674X_MASK_INT4);

        // 使能 定时器 / 计数器 中断
        TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
}

/****************************************************************************/
/*                                                                          */
/*              DSP 中断初始化                                              */
/*                                                                          */
/****************************************************************************/
void InterruptInit(void)
{
        // 初始化 DSP 中断控制器
        IntDSPINTCInit();

        // 使能 DSP 全局中断
        IntGlobalEnable();
}

/****************************************************************************/
/*                                                                          */


作者: leafy    时间: 2016-12-28 14:50
/*              中断服务函数                                                */
/*                                                                          */
/****************************************************************************/
void TimerIsr(void)
{
    // 禁用定时器 / 计数器中断
    TimerIntDisable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
    // 清除中断标志
    IntEventClear(SYS_INT_T64P2_TINTALL);
    TimerIntStatusClear(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
    //读取一次数据
    AD7606ReadOneSample(DOUT);
   /* if(adc_cnt>Num-1)
                                           {
                                             for(h=0;h<256;h++)
                                                     CH1_Sample[h]=0;
                                                 adc_cnt=0;
                                           }*/
    // 使能 定时器 / 计数器 中断
     TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
}
/*              延时                                                        */
/*                                                                          */
/****************************************************************************/
void Delay(volatile unsigned int count)
{
    while(count--);
}
//PinMUX函数
void GPIOBank1Pin14PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) &
                 ~(SYSCFG_PINMUX2_PINMUX2_7_4));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) =
         (PINMUX2_GPIO1_14_ENABLE | savePinmux);
}

void GPIOBank1Pin13PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) &
                 ~(SYSCFG_PINMUX2_PINMUX2_11_8));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) =
         (PINMUX2_GPIO1_13_ENABLE | savePinmux);
}

void GPIOBank1Pin12PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) &
                 ~(SYSCFG_PINMUX2_PINMUX2_15_12));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) =
         (PINMUX2_GPIO1_12_ENABLE | savePinmux);
}

void GPIOBank1Pin11PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) &
                 ~(SYSCFG_PINMUX2_PINMUX2_19_16));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) =
         (PINMUX2_GPIO1_11_ENABLE | savePinmux);
}

void GPIOBank1Pin10PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) &
                 ~(SYSCFG_PINMUX2_PINMUX2_23_20));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) =
         (PINMUX2_GPIO1_10_ENABLE | savePinmux);
}

void GPIOBank1Pin9PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) &
                 ~(SYSCFG_PINMUX2_PINMUX2_27_24));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) =
         (PINMUX2_GPIO1_9_ENABLE | savePinmux);
}

void GPIOBank8Pin7PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) &
                 ~(SYSCFG_PINMUX2_PINMUX2_31_28));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) =
         (PINMUX2_GPIO8_7_ENABLE | savePinmux);
}
//管脚输出函数
void AD7606_SCK_LOW(void)//GP1_11
{
        GPIORegs.CLR_DATA01.bit.GP1P11=1;
}

void AD7606_SCK_HIGH(void)//GP1_11
{
        GPIORegs.SET_DATA01.bit.GP1P11=1;
}

void AD7606_RST_LOW(void)//GP1_12
{
        GPIORegs.CLR_DATA01.bit.GP1P12=1;
}

void AD7606_RST_HIGH(void)//GP1_12
{
        GPIORegs.SET_DATA01.bit.GP1P12=1;
}

void AD7606_CNVST_LOW(void)//GP1_9
{
        GPIORegs.CLR_DATA01.bit.GP1P9=1;
}

void AD7606_CNVST_HIGH(void)//GP1_9
{
        GPIORegs.SET_DATA01.bit.GP1P9=1;
}

void AD7606_SCS_LOW(void)//GP1_10
{
        GPIORegs.CLR_DATA01.bit.GP1P10=1;
}

void AD7606_SCS_HIGH(void)//GP1_10
{
        GPIORegs.SET_DATA01.bit.GP1P10=1;
}//管脚读取数据函数
void AD7606ReadOneSample(int * buf)
{
        unsigned char j, k;
        unsigned short int TempA, TempB;


        AD7606_CNVST_LOW();
        Delay(70);
        AD7606_CNVST_HIGH();
        Delay(6);



        while(GPIORegs.IN_DATA01.bit.GP1P14==1)
        {

        }

        AD7606_SCS_LOW();

        for(j=0; j<4; j++)
        {
                TempA=0;
                TempB=0;

                for(k=0; k<16; k++)
                {
                        AD7606_SCK_LOW();

                        TempA=(TempA<<1) +GPIORegs.IN_DATA01.bit.GP1P13;
                        TempB=(TempB<<1) +GPIORegs.IN_DATA8.bit.GP8P7;

                        AD7606_SCK_HIGH();
                }

                buf[j]=(int)TempA;
                buf[4+j]=(int)TempB;

        }
        AD7606_SCS_HIGH();
        conv_flg=1;
        /* if(adc_cnt>Num-1)
                                       {
                                         for(h=0;h<256;h++)
                                                 CH1_Sample[h]=0;
                                             adc_cnt=0;
                                       }*/
}
//AD7606复位函数
void AD7606Reset(void)
{
            AD7606_RST_LOW();
                Delay(0xFFFF);
                AD7606_RST_HIGH();
                Delay(0x0001);
                AD7606_RST_LOW();
                AD7606_SCK_HIGH();
                AD7606_CNVST_HIGH();
                AD7606_SCS_HIGH();

}



作者: leafy    时间: 2016-12-28 14:59
本帖最后由 leafy 于 2016-12-28 15:03 编辑

使用的芯片是ADC7606,8通道同步串行读取,在通道一加一50HZ 3V正弦信号,用Graph工具single time画出

[attach]1765[/attach]



CH1_Sample的波形图如下:[attach]1766[/attach]





作者: leafy    时间: 2016-12-28 15:46
CH1_Sample[adc_cnt]是长度为256的数组,存满了256个数据之后,就是我们观察到的正弦波形。在我的程序里,无符号数adc_cnt++到65535之后回0,这期间波形是没有刷新的,adc_cnt回0之后才又对CH1_Sample 256个数组重新赋值,波形此时也能正确刷新,但是如果把adc_cnt的数据类型改成unsigned char,即8位的,那么新采集到的数据就会放在数组里面,理论上观察到的波形应该还是正弦,但是我做的仿真却得到了不一样的结果:[attach]1767[/attach][attach]1767[/attach]
我感觉是graph这个工具的刷新时间问题吧,毕竟我定时器设置的周期是200us,即采样频率是5KHZ,请问是不是这个样子的呢?


作者: leafy    时间: 2016-12-28 15:51
将程序暂停观察到的波形图是:
[attach]1768[/attach]
这里我也看不懂,中间为什么是那个样子的,而且我换个地方暂停:
[attach]1769[/attach]
也还是这个样子。请问下我怎么才能解决让图形自动刷新呢,adc_cnt++到65535的时间又太长了点,大概等了10几秒。





欢迎光临 嵌入式开发者社区 (https://51dsp.net/) Powered by Discuz! X3.4