今天写了一个程序,是关于外接DAC输出电压,ADC采样,再LCD12864显示的一个程序。然后就一直进入FaultISR,查了半天,问题竟然出自SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);这句。。
因为要让DAC采样频率快点,所以把DAC的引脚挂AHB总线上。。但是我单独的DAC采样程序,挂AHB总线没问题。。
不知道是什么原因,忘高手解答。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
今天写了一个程序,是关于外接DAC输出电压,ADC采样,再LCD12864显示的一个程序。然后就一直进入FaultISR,查了半天,问题竟然出自SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);这句。。
因为要让DAC采样频率快点,所以把DAC的引脚挂AHB总线上。。但是我单独的DAC采样程序,挂AHB总线没问题。。
不知道是什么原因,忘高手解答。
1. GPIO挂在哪个总线上不影响ADC的采样速度,默认值是最高值,是1M。
2.楼主试试在SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);这句话后面加一个SysCtlDelay(5);然后试一下。
不行把源码贴上来一起看看吧
不是ADC的采样速率,,是外接DAC的速率,用的IO口模拟SPI的通信方式。
一个外设使能后要经过几个时钟周期后才可以访问,否则会触发硬件错误。
先加个延迟试试,不行把代码都贴上来看看。
另,如果是SPI接口,使用SSI来做会更快。
不会呀。。我用示波器测了 IO口的最快频率(时钟频率80M)是7.58MHZ(这个问题我也想问,为什么IO口速度只有这么慢,而且挂AHB总线和挂APB总线一样)
而我测的SPI最高发送速率是6.42MHZ(发送4位),那就是25M的位速率喽。
但是外接DAC(TLV5618)发送数据只能一位一位发,因为是同步的,发一位数据就得来一个时钟信号。。而SPI又是一次最少发四位,所以只能四位当一位用喽,所以SPI的速度没有IO口模拟快喽。
这是我测试IO口速度的代码:
/*******************************************
开发坏境:CCSv5.4
开发板:TIVA C Launchpad(TM4C123GH6PM)
程序功能:测试GPIO速度
程序说明:GPIO翻转频率3.79MHZ(一高一低),即GPIO频率为7.58MHZ,
编程者:Linchpin
********************************************/
#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
int main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_10MHZ|SYSCTL_OSC_MAIN);
//SysCtlClockGet();
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);//使能GPIO外设
SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);//挂在AHB高性能总线上
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_4);
while(1)
{
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_PIN_4);
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_4, ~GPIO_PIN_4);
}
}
这是测试SPI速度的程序:
/*******************************************
开发坏境:CCSv5.4
开发板:TIVA C Launchpad(TM4C123GH6PM)
程序功能:SSI,发送数据(SPI协议)
程序说明:SPI最高发送速率6.42MHZ
编程者:Linchpin
********************************************/
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_ssi.h"
#include "inc/hw_types.h"
#include "driverlib/ssi.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
int main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_10MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
SysCtlGPIOAHBEnable(GPIO_PORTF_BASE);//挂在AHB高性能总线上
GPIOPinConfigure(GPIO_PF2_SSI1CLK);
GPIOPinConfigure(GPIO_PF3_SSI1FSS);
GPIOPinConfigure(GPIO_PF1_SSI1TX);
GPIOPinTypeSSI(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_2);
//SSI1_BASE/时钟频率/时钟协议,moto代表SPI协议/工作模式:主机模式/位速率4M/数据帧位数16
SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_1, SSI_MODE_MASTER, 32000000, 4);
SSIEnable(SSI1_BASE);
while(1)
{
//while(SSIBusy(SSI1_BASE)) ;//不忙时跳出循环
SSIDataPut(SSI1_BASE, 0xf);
SSIDataPut(SSI1_BASE, 0x0);
}
}
TM4C123x的SSI最高速度为25MHz,你设置的32MHz?这样带入库函数得到速度不对的。
另,2.1版本的SysCtlClockGet有点问题,取回来的不是真实主频。用ROM_SysCtlClockGet来获取真实主频。
对啊。最高位速率是25MHZ,跟我测的一样。。但是它至少要4位一起发。但我现在只能一位一位发。。所以只能四位当一位用喽。所以速度就除以4, 6.25MHZ了。
还有,为什么GPIO的速度只有7.58MMHZ
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_10MHZ|SYSCTL_OSC_MAIN);
这两种配置,用ROM_SysCtlClockGet();读出来频率都是80MHZ,但是测试出来的GPIO口速度就是不一样。请问这有什么区别吗?
SYSCTL_XTAL_*MHZ这个参数一定要和实际使用的数值一样。
使用其它数值可能会导致问题,详细的情况得分析一下库函数源码了。