跪求各路高手, ccs3.3 2812的adc採樣但sci不能傳輸, 請求幫助
时间:10-02
整理:3721RD
点击:
下面的碼就是結合了adc 和scki的, 但sci就是不能傳輸出去, 懇求指點
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
// 函数原型声明.
void Gpio_select(void);
void InitSystem(void);
interrupt void adc_isr(void); // ADC结果读取中断服务程序
void SCI_Init(void);
// 全局变量:
int Voltage_A0;
int Voltage_B0;
int ADresult_num = 0;
int ADC_buffer1[1024]={0};
int ADC_buffer2[1024]={0};
long abc[2];
int count=1;
long message[2];
unsigned long i;
void main(void)
{
message[0]=0x1122;
message[1]=0x3344;
InitSystem(); // 初始化DSP内核寄存器
Gpio_select(); // 配置GPIO复用寄存器
InitPieCtrl(); // 调用外设中断扩展初始化单元 PIE-unit ( 代码 : DSP281x_PieCtrl.c)
InitPieVectTable(); // 初始化 PIE vector向量表 ( 代码 : DSP281x_PieVect.c )
InitAdc(); // Function call for basic ADC initialisation
// 重新映射 PIE - Timer 1的比较中断
EALLOW; // 解除寄存器保护
PieVectTable.ADCINT = &adc_isr;
EDIS; // 使能寄存器保护
// 使能ADC中断: PIE-Group1 , interrupt 6
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
// 使能 CPU INT1 (连接到CPU-Timer 0中断)
IER = 1;
// 全局中断使能和更高优先级的实时调试事件
EINT; // 全局中断使能INTM
ERTM; // 使能实时调试中断DBGM
// 配置 ADC
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; // 双排序器模式
AdcRegs.ADCTRL1.bit.CONT_RUN = 0; // 非连续运行
AdcRegs.ADCTRL1.bit.CPS = 0; // 预定标系数 = 1
AdcRegs.ADCMAXCONV.all = 0x0001; // SEQ1中设置2个转换
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 设置ADCINA0作为第一个SEQ1变换// 假定在系统初始化中EVA的时钟已经被使能
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x8; // 设置ADCINB0作为第二个SEQ1变换.//由T1/T2逻辑驱动 T1PWM / T2PWM
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; // 使能EVASOC启动SEQ1 // GP Timer 1 比较的输出的有效
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能SEQ1中断(每次 EOEvaRegs.GPTCONA.bit.T1PIN = 1);
AdcRegs.ADCTRL3.bit.ADCCLKPS = 2; // HSPCLK进行4分频
// 配置事件管理器 EVA
// Assumes EVA Clock is already enabled in InitSysCtrl();
// 禁止 T1PWM / T2PWM 输出
EvaRegs.GPTCONA.bit.TCMPOE = 0;
// GP Timer 1 比较输出强制为低
EvaRegs.GPTCONA.bit.T1PIN = 0;
EvaRegs.GPTCONA.bit.T1TOADC = 2; // 使能事件管理器A的EVASOC
EvaRegs.T1CON.bit.FREE = 0; // 仿真器连接处理器时模块处于挂起状态
EvaRegs.T1CON.bit.SOFT = 0; // 仿真器连接处理器时模块处于挂起状态
EvaRegs.T1CON.bit.TMODE = 2; // 连续递增模式
EvaRegs.T1CON.bit.TPS = 7; // 预定标系数 = 128
EvaRegs.T1CON.bit.TENABLE = 1; // 使能 GP Timer 1
EvaRegs.T1CON.bit.TCLKS10 = 0; // 内部时钟
EvaRegs.T1CON.bit.TCLD10 = 0; // 当等于0时比较重新装载
EvaRegs.T1CON.bit.TECMPR = 0; // 禁止比较操作
EvaRegs.T1PR = 58;
while(1)
{
for(i=0;i<1500000;i++)
{
EALLOW;
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
if(ADresult_num==1023)
{
int index,index_1;
for(index=0;index<2;index++)
{
abc[0]=message[index]>>8;
abc[1]=message[index];
for(index_1=0;index_1<2;index_1++)
{
SciaRegs.SCITXBUF = abc[index_1];
while(SciaRegs.SCICTL2.bit.TXRDY == 0);
while (SciaRegs.SCICTL2.bit.TXEMPTY == 0);
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
}
}
}
}
}
}
void Gpio_select(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x0; // 所有 GPIO 端口配置为I/O
GpioMuxRegs.GPBMUX.all = 0x0;
GpioMuxRegs.GPDMUX.all = 0x0;
GpioMuxRegs.GPFMUX.all = 0x0;
GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1; //配置 SCI-RX
GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
GpioMuxRegs.GPEMUX.all = 0x0;
GpioMuxRegs.GPGMUX.all = 0x0;
GpioMuxRegs.GPADIR.all = 0x0; // GPIO PORT 配置为输入
GpioMuxRegs.GPBDIR.all = 0x00; // GPIO PORT 配置为输入
GpioMuxRegs.GPDDIR.all = 0x0; // GPIO PORT 配置为输入
GpioMuxRegs.GPEDIR.all = 0x0; // GPIO PORT 配置为输入
GpioMuxRegs.GPFDIR.all = 0x0; // GPIO PORT 配置为输入
GpioMuxRegs.GPGDIR.all = 0x0; // GPIO PORT 配置为输入
GpioMuxRegs.GPAQUAL.all = 0x0; // 设置所有 GPIO 输入的量化值等于0
GpioMuxRegs.GPBQUAL.all = 0x0;
GpioMuxRegs.GPDQUAL.all = 0x0;
GpioMuxRegs.GPEQUAL.all = 0x0;
EDIS;
}
void InitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0x00AF; // 配置看门狗
// 0x00E8 禁止看门狗,预定标系数Prescaler = 1
// 0x00AF 不禁止看门狗, 预定标系数Prescaler = 64
SysCtrlRegs.SCSR = 0; // 看门狗产生复位
SysCtrlRegs.PLLCR.bit.div = 10; // 配置处理器锁相环,倍频系数为5
SysCtrlRegs.HISPCP.all = 0x1; // 配置高速外设时钟分频系数: 2
SysCtrlRegs.LOSPCP.all = 0x2; // 配置低速外设时钟分频系数: 4
// 使用的外设时钟时钟设置:
// 一般不使用的外设的时钟禁止,降低系统功耗
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; // 使能SCI模块的时钟
SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
EDIS;
}
interrupt void adc_isr(void)
{
// 每次定时器中断处理看门狗
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
EDIS;
//采样结果保存
Voltage_A0 = AdcRegs.ADCRESULT0>>4;
Voltage_B0 = AdcRegs.ADCRESULT1>>4;
if(ADresult_num<1024)
{
ADresult_num++;
ADC_buffer1[ADresult_num] = Voltage_A0;
ADC_buffer2[ADresult_num] = Voltage_B0;
}
else
{
int z;
for(z=0;z<10000;z++)
{
DELAY_US(1000);
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
}
count++;
ADresult_num = 0;
}
// 为下一个ADC排序重新初始化
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // 复位 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // 清除 INT SEQ1 位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 中断响应位置位
}
void SCI_Init(void)
{
SciaRegs.SCICCR.all =0x0007; // 1bit 停止位 无循环模式
// 无极性, 字符长度:8 bits,
// 异步模式, 空闲线协议
SciaRegs.SCICTL1.all =0x0003; // 使能 TX, RX, 内部 SCICLK,
// 禁止 RX ERR, SLEEP, TXWAKE
SciaRegs.SCIHBAUD = 487 >> 8 ; // 波特率:9600(LSPCLK = 37.5MHz) ;
SciaRegs.SCILBAUD = 487 & 0x00FF;
SciaRegs.SCICTL1.all =0x0023; // 使SCI退出复位
}
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
// 函数原型声明.
void Gpio_select(void);
void InitSystem(void);
interrupt void adc_isr(void); // ADC结果读取中断服务程序
void SCI_Init(void);
// 全局变量:
int Voltage_A0;
int Voltage_B0;
int ADresult_num = 0;
int ADC_buffer1[1024]={0};
int ADC_buffer2[1024]={0};
long abc[2];
int count=1;
long message[2];
unsigned long i;
void main(void)
{
message[0]=0x1122;
message[1]=0x3344;
InitSystem(); // 初始化DSP内核寄存器
Gpio_select(); // 配置GPIO复用寄存器
InitPieCtrl(); // 调用外设中断扩展初始化单元 PIE-unit ( 代码 : DSP281x_PieCtrl.c)
InitPieVectTable(); // 初始化 PIE vector向量表 ( 代码 : DSP281x_PieVect.c )
InitAdc(); // Function call for basic ADC initialisation
// 重新映射 PIE - Timer 1的比较中断
EALLOW; // 解除寄存器保护
PieVectTable.ADCINT = &adc_isr;
EDIS; // 使能寄存器保护
// 使能ADC中断: PIE-Group1 , interrupt 6
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
// 使能 CPU INT1 (连接到CPU-Timer 0中断)
IER = 1;
// 全局中断使能和更高优先级的实时调试事件
EINT; // 全局中断使能INTM
ERTM; // 使能实时调试中断DBGM
// 配置 ADC
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; // 双排序器模式
AdcRegs.ADCTRL1.bit.CONT_RUN = 0; // 非连续运行
AdcRegs.ADCTRL1.bit.CPS = 0; // 预定标系数 = 1
AdcRegs.ADCMAXCONV.all = 0x0001; // SEQ1中设置2个转换
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 设置ADCINA0作为第一个SEQ1变换// 假定在系统初始化中EVA的时钟已经被使能
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x8; // 设置ADCINB0作为第二个SEQ1变换.//由T1/T2逻辑驱动 T1PWM / T2PWM
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; // 使能EVASOC启动SEQ1 // GP Timer 1 比较的输出的有效
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能SEQ1中断(每次 EOEvaRegs.GPTCONA.bit.T1PIN = 1);
AdcRegs.ADCTRL3.bit.ADCCLKPS = 2; // HSPCLK进行4分频
// 配置事件管理器 EVA
// Assumes EVA Clock is already enabled in InitSysCtrl();
// 禁止 T1PWM / T2PWM 输出
EvaRegs.GPTCONA.bit.TCMPOE = 0;
// GP Timer 1 比较输出强制为低
EvaRegs.GPTCONA.bit.T1PIN = 0;
EvaRegs.GPTCONA.bit.T1TOADC = 2; // 使能事件管理器A的EVASOC
EvaRegs.T1CON.bit.FREE = 0; // 仿真器连接处理器时模块处于挂起状态
EvaRegs.T1CON.bit.SOFT = 0; // 仿真器连接处理器时模块处于挂起状态
EvaRegs.T1CON.bit.TMODE = 2; // 连续递增模式
EvaRegs.T1CON.bit.TPS = 7; // 预定标系数 = 128
EvaRegs.T1CON.bit.TENABLE = 1; // 使能 GP Timer 1
EvaRegs.T1CON.bit.TCLKS10 = 0; // 内部时钟
EvaRegs.T1CON.bit.TCLD10 = 0; // 当等于0时比较重新装载
EvaRegs.T1CON.bit.TECMPR = 0; // 禁止比较操作
EvaRegs.T1PR = 58;
while(1)
{
for(i=0;i<1500000;i++)
{
EALLOW;
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
if(ADresult_num==1023)
{
int index,index_1;
for(index=0;index<2;index++)
{
abc[0]=message[index]>>8;
abc[1]=message[index];
for(index_1=0;index_1<2;index_1++)
{
SciaRegs.SCITXBUF = abc[index_1];
while(SciaRegs.SCICTL2.bit.TXRDY == 0);
while (SciaRegs.SCICTL2.bit.TXEMPTY == 0);
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
}
}
}
}
}
}
void Gpio_select(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x0; // 所有 GPIO 端口配置为I/O
GpioMuxRegs.GPBMUX.all = 0x0;
GpioMuxRegs.GPDMUX.all = 0x0;
GpioMuxRegs.GPFMUX.all = 0x0;
GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1; //配置 SCI-RX
GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
GpioMuxRegs.GPEMUX.all = 0x0;
GpioMuxRegs.GPGMUX.all = 0x0;
GpioMuxRegs.GPADIR.all = 0x0; // GPIO PORT 配置为输入
GpioMuxRegs.GPBDIR.all = 0x00; // GPIO PORT 配置为输入
GpioMuxRegs.GPDDIR.all = 0x0; // GPIO PORT 配置为输入
GpioMuxRegs.GPEDIR.all = 0x0; // GPIO PORT 配置为输入
GpioMuxRegs.GPFDIR.all = 0x0; // GPIO PORT 配置为输入
GpioMuxRegs.GPGDIR.all = 0x0; // GPIO PORT 配置为输入
GpioMuxRegs.GPAQUAL.all = 0x0; // 设置所有 GPIO 输入的量化值等于0
GpioMuxRegs.GPBQUAL.all = 0x0;
GpioMuxRegs.GPDQUAL.all = 0x0;
GpioMuxRegs.GPEQUAL.all = 0x0;
EDIS;
}
void InitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0x00AF; // 配置看门狗
// 0x00E8 禁止看门狗,预定标系数Prescaler = 1
// 0x00AF 不禁止看门狗, 预定标系数Prescaler = 64
SysCtrlRegs.SCSR = 0; // 看门狗产生复位
SysCtrlRegs.PLLCR.bit.div = 10; // 配置处理器锁相环,倍频系数为5
SysCtrlRegs.HISPCP.all = 0x1; // 配置高速外设时钟分频系数: 2
SysCtrlRegs.LOSPCP.all = 0x2; // 配置低速外设时钟分频系数: 4
// 使用的外设时钟时钟设置:
// 一般不使用的外设的时钟禁止,降低系统功耗
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; // 使能SCI模块的时钟
SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
EDIS;
}
interrupt void adc_isr(void)
{
// 每次定时器中断处理看门狗
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
EDIS;
//采样结果保存
Voltage_A0 = AdcRegs.ADCRESULT0>>4;
Voltage_B0 = AdcRegs.ADCRESULT1>>4;
if(ADresult_num<1024)
{
ADresult_num++;
ADC_buffer1[ADresult_num] = Voltage_A0;
ADC_buffer2[ADresult_num] = Voltage_B0;
}
else
{
int z;
for(z=0;z<10000;z++)
{
DELAY_US(1000);
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
}
count++;
ADresult_num = 0;
}
// 为下一个ADC排序重新初始化
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // 复位 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // 清除 INT SEQ1 位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 中断响应位置位
}
void SCI_Init(void)
{
SciaRegs.SCICCR.all =0x0007; // 1bit 停止位 无循环模式
// 无极性, 字符长度:8 bits,
// 异步模式, 空闲线协议
SciaRegs.SCICTL1.all =0x0003; // 使能 TX, RX, 内部 SCICLK,
// 禁止 RX ERR, SLEEP, TXWAKE
SciaRegs.SCIHBAUD = 487 >> 8 ; // 波特率:9600(LSPCLK = 37.5MHz) ;
SciaRegs.SCILBAUD = 487 & 0x00FF;
SciaRegs.SCICTL1.all =0x0023; // 使SCI退出复位
}