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.

[参考译文] LAUNCHXL-F28027:无法更改 LOSPCP、导致 SCI 传输失败。

Guru**** 1825110 points
Other Parts Discussed in Thread: ADS8326, C2000WARE, CONTROLSUITE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1341115/launchxl-f28027-unable-to-change-lospcp-resulting-in-failed-sci-transmissions

器件型号:LAUNCHXL-F28027
主题中讨论的其他器件:ADS8326C2000WAREcontrolSUITE

您好!

我是 F28027的初学者、现在我正在尝试配置 SCI。 我已经成功地将器件配置为9600波特、但无法将 其增加到115200。  

首先、我将低速时钟预分频器(LOSPCP)设置为/1。

CLK_setLowSpdPreScaler(myClk, CLK_LowSpdPreScaler_SysClkOut_by_1);

接下来、我设置 BRR 寄存器值、我计算如下:
BRR =(60MHz /(115200* 8))-1 = 64.10 ~ 64
反向计算波特-->(60MHz)/((16+1)* 8)= 115384.61波特、0.16%误差

SCI_setBaudRate(mySci, (SCI_BaudRate_e)64);

当我打开终端时、传输是一组随机字符。  

我仔细检查了寄存器、发现 BRR 正在按预期更新、但 LOSPCP 没有在默认值0x0002基础上发生变化。

我正在使用 CLK_setLowSpdPreScaler()函数,但似乎没有效果。 我查看了 clk.c 文件、它看起来处理 EALLOW 和 EDIS、所以我假设这不是问题。

为了修改 LOSPCP、是否需要更改或设置其他内容? 很抱歉、这是一个基本问题、但除了需要设置 EALLOW 外、我还难以在参考手册中找到有关更改此寄存器的信息。

下面是该项目的屏幕截图:  

这是我的 main.c :

#include "DSP28x_Project.h" // Device Headerfile and Examples Include File (includes stdint.h)

// Include driver header files
#include "f2802x_common/include/adc.h"
#include "f2802x_common/include/clk.h"
#include "f2802x_common/include/gpio.h"
#include "f2802x_common/include/pie.h"
#include "f2802x_common/include/pll.h"
#include "f2802x_common/include/timer.h"
#include "f2802x_common/include/wdog.h"
#include "f2802x_common/include/sci.h"
#include "f2802x_common/include/spi.h"

// Declare function prototype
__interrupt void cpu_timer0_isr(void);
void gpio_setup(void);
void sci_setup(void);
void spi_setup(void);
void spi_fifo_init(void);

// Declare Handles
ADC_Handle myAdc;
CLK_Handle myClk;
GPIO_Handle myGpio;
PIE_Handle myPie;
TIMER_Handle myTimer;
SCI_Handle mySci;
SPI_Handle mySpi;

int main(void)
{
// Declare local handles
CPU_Handle myCpu;
WDOG_Handle myWDog;
PLL_Handle myPll;

// Initialize handles
myAdc = ADC_init((void *)ADC_BASE_ADDR, sizeof(ADC_Obj));
myClk = CLK_init((void *)CLK_BASE_ADDR, sizeof(CLK_Obj));
myCpu = CPU_init((void *)NULL, sizeof(CPU_Obj));
myGpio = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));
myPie = PIE_init((void *)PIE_BASE_ADDR, sizeof(PIE_Obj));
myPll = PLL_init((void *)PLL_BASE_ADDR, sizeof(PLL_Obj));
myTimer = TIMER_init((void *)TIMER0_BASE_ADDR, sizeof(TIMER_Obj));
myWDog = WDOG_init((void *)WDOG_BASE_ADDR, sizeof(WDOG_Obj));
mySci = SCI_init((void *)SCIA_BASE_ADDR,sizeof(SCI_Obj));
mySpi = SPI_init((void *)SPIA_BASE_ADDR, sizeof(SPI_Obj));

// Initialize watchdog handle and disable.
myWDog = WDOG_init((void *)WDOG_BASE_ADDR, sizeof(WDOG_Obj));
WDOG_disable(myWDog);

// Load oscillator calibration values using Device_cal
// According to TRM section 1.3.2.1.2, ADC clocks must be enabled to calibrate the oscillators and ADC parameters.
CLK_enableAdcClock(myClk);
(*Device_cal)();
CLK_disableAdcClock(myClk); //Since the ADC is not needed for this application, it is disabled once calibration is done.

// Set internal oscillator 1 as the clock source.
CLK_setOscSrc(myClk, CLK_OscSrc_Internal);

// Internal oscillator 1 runs at 10MHz, I need 60MHz. Multiply 10MHz by 12, divide by 2
PLL_setup(myPll, PLL_Multiplier_12, PLL_DivideSelect_ClkIn_by_2);

//Disable PIE and all interrupts before changing PIE
PIE_disable(myPie);
PIE_disableAllInts(myPie);
CPU_disableGlobalInts(myCpu);
CPU_clearIntFlags(myCpu);

// Re-enable PIE
PIE_enable(myPie);

// Register interrupt handlers in the PIE vector table
// Group number and subgroup number from TRM Table 1-110.
PIE_registerPieIntHandler(myPie, PIE_GroupNumber_1, PIE_SubGroupNumber_7,
(intVec_t)&cpu_timer0_isr);

#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif

// Configure CPU-Timer 0 to interrupt every 100 milliseconds:
// 60MHz CPU Frequency
TIMER_stop(myTimer);
TIMER_setPeriod(myTimer, (uint32_t)(60 * 100000));
TIMER_setPreScaler(myTimer, 0);
TIMER_reload(myTimer);
TIMER_setEmulationMode(myTimer, TIMER_EmulationMode_StopAfterNextDecrement); //Note this is the default.
TIMER_enableInt(myTimer);

TIMER_start(myTimer);

//Initialize GPIO
gpio_setup();

//Set up SCIA
sci_setup();

//Set up SPI
spi_setup();
spi_fifo_init(); // Initialize the SPI FIFOs

// Enable CPU INT1 which is connected to CPU-Timer 0:
CPU_enableInt(myCpu, CPU_IntNumber_1);

// Enable TINT0 in the PIE: Group 1 interrupt 7
PIE_enableTimer0Int(myPie);

// Enable global Interrupts and higher priority real-time debug events
CPU_enableGlobalInts(myCpu);
CPU_enableDebugInt(myCpu);

while(1){

//Control state of LED D4 using Switch S3
if(GPIO_getData(myGpio, GPIO_Number_12)){
GPIO_setLow(myGpio, GPIO_Number_1);
}
else{
GPIO_setHigh(myGpio, GPIO_Number_1);
}
}

}

void gpio_setup(void){
//LED D2 is connected to GPIO0. Set GPIO0 to GPIO configuration, output direction, and disable pull-up.
GPIO_setMode(myGpio, GPIO_Number_0, GPIO_0_Mode_GeneralPurpose);
GPIO_setDirection(myGpio, GPIO_Number_0, GPIO_Direction_Output);
GPIO_setPullUp(myGpio, GPIO_Number_0, GPIO_PullUp_Disable);
GPIO_setHigh(myGpio, GPIO_Number_0); //Initialize GPIO0 to known state

//LED D4 is connected to GPIO1. Set GPIO1 to GPIO configuration, output direction, and disable pull-up.
GPIO_setMode(myGpio, GPIO_Number_1, GPIO_0_Mode_GeneralPurpose);
GPIO_setDirection(myGpio, GPIO_Number_1, GPIO_Direction_Output);
GPIO_setPullUp(myGpio, GPIO_Number_1, GPIO_PullUp_Disable);
GPIO_setHigh(myGpio, GPIO_Number_1); //Initialize GPIO0 to known state

//LED D3 is connected to GPIO2.
GPIO_setMode(myGpio, GPIO_Number_2, GPIO_0_Mode_GeneralPurpose);
GPIO_setDirection(myGpio, GPIO_Number_2, GPIO_Direction_Output);
GPIO_setPullUp(myGpio, GPIO_Number_2, GPIO_PullUp_Disable);
GPIO_setHigh(myGpio, GPIO_Number_2); //Initialize GPIO0 to known state

//Switch S3 is connected to GPIO12. Set GPIO12 to GPIO configuration, input direction, and disable pull-up.
GPIO_setMode(myGpio, GPIO_Number_12, GPIO_0_Mode_GeneralPurpose);
GPIO_setDirection(myGpio, GPIO_Number_12, GPIO_Direction_Input);
GPIO_setPullUp(myGpio, GPIO_Number_12, GPIO_PullUp_Disable);
}

__interrupt void cpu_timer0_isr(void){
uint16_t txData16 = 0xFFFF;
uint16_t adcData = 0x0000;
uint16_t rxData1 = 0x0000;
uint16_t rxData2 = 0x0000;
//int i = 0;

//Set GPIO0 for debugging/LED
GPIO_setHigh(myGpio, GPIO_Number_0);

//SPI Transmit two 16 bit words to TX FIFO
SPI_write(mySpi,txData16);
SPI_write(mySpi,txData16);

//Wait for 2 words to arrive
while(SPI_getRxFifoStatus(mySpi) != SPI_FifoStatus_2_Words)
{
}

//SPI Read two 16 bit words from RX FIFO
rxData1 = SPI_read(mySpi);
rxData2 = SPI_read(mySpi);

//Combine rxData; discard first 6
adcData = ((rxData1 << 6) & 0xFFC0) | ((rxData2 >> 10) & 0x003F);

//UART Transmit
//Send 16 bit integer as 4 4-bit integers (
//Terminate with line feed "\n"
SCI_putDataBlocking(mySci, (uint8_t)(((adcData & 0xF000) >> 12) + 0x41));
SCI_putDataBlocking(mySci, (uint8_t)(((adcData & 0x0F00) >> 8) + 0x41));
SCI_putDataBlocking(mySci, (uint8_t)(((adcData & 0x00F0) >> 4) + 0x41));
SCI_putDataBlocking(mySci, (uint8_t)(((adcData & 0x000F) >> 0) + 0x41));
SCI_putDataBlocking(mySci, 0x0A); //LF

//Acknowledge interrupt so more interrupts from group 1 can be received.
PIE_clearInt(myPie, PIE_GroupNumber_1);

//Set GPIO0
GPIO_setLow(myGpio, GPIO_Number_0);
}

void sci_setup(void){
//See Example_2802xSci_FFDLB_int.c and TRM section 9.4 for configuration instructions
GPIO_setPullUp(myGpio,GPIO_Number_28,GPIO_PullUp_Enable);
GPIO_setPullUp(myGpio,GPIO_Number_29,GPIO_PullUp_Disable);
GPIO_setQualification(myGpio,GPIO_Number_28,GPIO_Qual_ASync);
GPIO_setMode(myGpio,GPIO_Number_28,GPIO_28_Mode_SCIRXDA);
GPIO_setMode(myGpio,GPIO_Number_29,GPIO_29_Mode_SCITXDA);

//Peripheral registers cannot be modified unless clock to the specific peripheral is enabled.
//Source: Firmware Dev. Package User's Guide, section 2.6.
//Enable clock to SCIA
CLK_enableSciaClock(myClk);

//Set UART Settings. Parity disabled by default.
SCI_disableParity(mySci);
SCI_setNumStopBits(mySci, SCI_NumStopBits_One);
SCI_setCharLength(mySci, SCI_CharLength_8_Bits);

//Enable Rx, Tx, Rx interrupt, Tx interrupt
SCI_enableTx(mySci);
SCI_enableRx(mySci);
//SCI_enableTxInt(mySci); //Not needed.
SCI_enableRxInt(mySci);

//Disable loopback
SCI_disableLoopBack(mySci);

//RX ERR, Sleep, and TXWAKE are disabled by default after system reset.

//Set Baud Rate
//Clock for SCI comes from LSPCLK, which is just SYSCLKOUT divided down according to LOSPCP register, default /4.
//LSPCLK = SYSCLKOUT/(LOSPCP*2) . If LOSPCP = 0, LSPCLK = SYSCLKOUT
//Baud rate = LSPCLK / ((BRR+1)*8), or inverse BRR = (LSPCLK/(Baud*8))-1
//BRR is the 16 bit value stored across SCIHBAUD and SCILBAUD
// SCI BRR = LSPCLK/(SCI BAUDx8) - 1

//Assuming 60MHz clock for F28027 and goal of 9600 Baud, LSPCLK = 60MHz/4 = 15MHz
//BRR = (15MHz/(9600*8))-1 = 194.31 ~ 194
//Back calculate Baud --> (60MHz/4)/((194+1)*8) = 9615.3 Baud, 0.16% error
// SCI_setBaudRate(mySci, (SCI_BaudRate_e)194);

// For 115200, change LOSPCP pre-scaler to /1 for better resolution
//BRR = (60MHz/(115200*8))-1 = 64.10 ~ 64
//Back calculate Baud --> (60MHz)/((16+1)*8) = 115384.61 Baud, 0.16% error
CLK_setLowSpdPreScaler(myClk, CLK_LowSpdPreScaler_SysClkOut_by_1);
SCI_setBaudRate(mySci, (SCI_BaudRate_e)64);

//Enable SCI
SCI_enable(mySci);
}

void spi_setup(void){
// Initialize GPIO for SPI
GPIO_setPullUp(myGpio, GPIO_Number_16, GPIO_PullUp_Enable);
GPIO_setPullUp(myGpio, GPIO_Number_17, GPIO_PullUp_Enable);
GPIO_setPullUp(myGpio, GPIO_Number_18, GPIO_PullUp_Enable);
GPIO_setPullUp(myGpio, GPIO_Number_19, GPIO_PullUp_Enable);
GPIO_setQualification(myGpio, GPIO_Number_16, GPIO_Qual_ASync); //See TRM 1.4.4.1, SPI peripheral controls synchronization.
GPIO_setQualification(myGpio, GPIO_Number_17, GPIO_Qual_ASync);
GPIO_setQualification(myGpio, GPIO_Number_18, GPIO_Qual_ASync);
GPIO_setQualification(myGpio, GPIO_Number_19, GPIO_Qual_ASync);
GPIO_setMode(myGpio, GPIO_Number_16, GPIO_16_Mode_SPISIMOA);
GPIO_setMode(myGpio, GPIO_Number_17, GPIO_17_Mode_SPISOMIA);
GPIO_setMode(myGpio, GPIO_Number_18, GPIO_18_Mode_SPICLKA);
GPIO_setMode(myGpio, GPIO_Number_19, GPIO_19_Mode_SPISTEA_NOT);

// Set GPIO 32 and 33 to inputs because they are jumped by traces to GPIO 16 and 17
//32 and 33 default to GPIO (see GPBMUX1 register), input direction (GPBDIR), enabled pull-up (GPBPUD).

//Enable clock first to allow change of configuration registers.
CLK_enableSpiaClock(myClk);

//Set SPISWRESET bit, as directed by TRM 8.4.2
//This will also clear the OVERRUN_FLAG and INT_FLAG bits
SPI_reset(mySpi);

// Enable master mode
SPI_setMode(mySpi, SPI_Mode_Master);
SPI_enableTx(mySpi);

//ADC is TI ADS8326, positive edge for DOUT
SPI_setClkPhase(mySpi, SPI_ClkPhase_Normal);
SPI_setClkPolarity(mySpi, SPI_ClkPolarity_OutputFallingEdge_InputRisingEdge);

SPI_setBaudRate(mySpi, SPI_BaudRate_1_MBaud); //DIFFERENT VALUE MIGHT BE NEEDED SINCE ENUM ASSUMES 12.5MHz
//ADC can handle 24kHz to 6MHz. 15/12 = 1.25MHz

// Set 16-bit char bits
SPI_setCharLength(mySpi, SPI_CharLength_16_Bits);

// Release SPI from Reset
SPI_enable(mySpi);

return;
}

void spi_fifo_init()
{
// Initialize SPI FIFO registers
SPI_enableChannels(mySpi);
SPI_enableFifoEnh(mySpi);
SPI_resetTxFifo(mySpi);
SPI_clearTxFifoInt(mySpi);
SPI_resetRxFifo(mySpi);
SPI_clearRxFifoInt(mySpi);
SPI_setRxFifoIntLevel(mySpi, SPI_FifoLevel_4_Words);

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oscar、

    您能否尝试单步执行您的代码、同时观察 CCS 寄存器窗口中的 LOSPCP 寄存器、持续刷新以查看寄存器值是否/何时更改-特别是、请观察以查看它是否从以下行更改为000 (这可能是/1):

    CLK_setLowSpdPreScaler(myClk, CLK_LowSpdPreScaler_SysClkOut_by_1);

    如果它发生变化、请继续单步执行、以查看之后它是否改回默认值。

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Allison:

    感谢您的建议。 我按照您的建议进入了调试模式并打开了持续刷新。 当我单击"Step into (F5)"时、收到错误消息"Can't find a source file at "..."、如下面的屏幕截图所示:

    我以前从未尝试过这种方法;这是我应该期待的吗? 我检查了 clk.c 是否包含在我的 main.c 文件的顶部、因此我认为它存在?  

    我还在错误窗口上尝试了"查看反汇编"按钮、并逐步执行"Assembly Step Into"。 当我在观看 LOSPCP 的同时单步执行汇编说明时、它不会发生变化。 我重试了这个,并在每一行后手动点击刷新,以确保事情正在刷新,但没有运气。 LOSPCP 一直保留为0x0002。 这是我单步执行的汇编指令的屏幕截图。

    为了确保单步执行其他方面的装配说明、我还单步执行了以下行:
    SCI_setBaudRate(mySci, (SCI_BaudRate_e)64);

    我观察到 SCILBAUD 按预期更改为0x0040、因此好像持续刷新和单步执行指令对其他事情是有效的。

    如上所述、我从未在调试模式下尝试单步执行、因此如果我使用调试模式生成基本错误、请告诉我。  

    谢谢!

    奥斯卡

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oscar、

    您是否尝试使用"单步执行"您的应用程序代码行以便仅查看(概括)哪个行更改了 LOSPCP (如果有)?

    如果您看到 SCILBAUD 按预期更改、则调试会话设置似乎工作正常。 我的猜测是您的函数最初可能已正确更改 LOSPCP、但在您将其配置为/1后、另一个代码会将其设置回默认值。  您能否在配置 LOSPCP 的行上和紧接着设置一个断点? 这也可能有助于查看它是否发生变化。  

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Allison:

    我只是尝试了"跨步"通过所有main.c和观看 LOSPCP。 所有行都不会改变 LOSPCP、但我可能会看到其他寄存器(例如 PCLKCR0)在不同点发生变化。  

    我还尝试了您的建议CLK_setLowSpdPreScaler()、即在设置断点、并手动将 LOSPCP 更改为0x0000。 这起作用了! 我继续单步执行、直到我达到while(1){}并且 LOSPCP 没有改回0x0002。 然后、我让执行恢复并检查我的串行监视器。 不过、得到了预期的结果(如下面的屏幕截图所示)。 然后才会 收到垃圾符号。  

    我想这意味着 CLK_setLowSpdPreScaler()没有效果?

    我尝试了一些其他的东西,希望是有益的。

    我尝试替换以下行:
    CLK_setLowSpdPreScaler(myClk, CLK_LowSpdPreScaler_SysClkOut_by_1);

    替换为以下三行:

    EALLOW;
    SysCtrlRegs.LOSPCP.all = 0x0000;
    EDIS;

    当我在调试模式下单步执行 LOSPCP 时、这没有更改 LOSPCP、但我在构建后收到了许多警告。 警告显示在以下屏幕截图中:

    我认为这与链接器文件(我非常了解它)相关、但不知道如何清除错误。 这是一个能够更改 LOSPCP 的问题还是不相关的问题?

    我还尝试了将CLK_setLowSpdPreScaler()线移动到配置中的各个点。 例如,在禁用看门狗之后,在CLK_setOscSrc()、之后PLL_setup()和许多其他位置。 我的理论是、LOSPCP 配置可能需要在配置其他与时钟相关的东西的特定阶段发生。 不幸的是、这没有帮助。  

    我在逐步执行时注意到的最后一件事main()#ifdef _FLASH未输入指令并且memcpy()未达到指令。 我不知道这是否会影响 LOSPCP 的更改、但我认为我已经配置了从闪存运行的内容。 我通过重启 Launchpad 检查此情况、然后应用肯定会重新启动(通过获取常见垃圾字符串进行验证)。

    感谢您到目前为止的帮助。

    奥斯卡

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oscar、

    很好的调试进度! 感谢更新。 我还想指出的一点是、在我们的示例中、我们通常 在 main ()开头附近调用 InitSysCtrl () f 来禁用看门狗、设置 PLLCR 以获得合适的 SYSCLKOUT 频率、为高频和低频外设时钟设置预分频器、 并启用外设的时钟。  您是否/是否尝试过使用 InitSysCtrl ()函数将系统控制寄存器设置为已知状态?  

    总的来说、我想问您是否 已经参考了一些现有的 C2000Ware 示例来比较您的初始化? 如果不是、这也可能有用、因为在我们的示例中初始化顺序处于工作状态。 我想知道在您设置未正确设置的 LOSPCP 之前、是否需要首先执行其他操作。

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Allison:

    感谢您的建议。 我试图添加InitSysCtrl()到 main.c 的开头、但这会导致一些错误。 我还没有想出如何摆脱的错误,但将继续尝试. 看看使用的示例InitSysCtrl(),他们似乎只需要 #include "DSP28x_Project.h",我已经包括在我的代码,所以我不知道为什么它不起作用。 "你知道吗?

    关于 C2000Ware 示例、它们非常有帮助。 我的代码主要是"example_2802xCpuTimer.c"和"example_2802xScia_FFDLB.c"的组合、特别是来自"drriver"示例文件夹。 我在'driver'示例中注意到 InitSysCtrl()没有被使用,但对于'strect'示例,它是。 我认为"驱动程序"示例依赖于 clk_init ()等函数来执行 InitSysCtrl ()的工作,但我可能是错的。

    我查看了 InitSysCtrl()的定义,它将 LOSPCP 设置为默认值0x0002,类似于我尝试(失败)的方法。  
    EALLOW;

    SysCtrlRegs.LOSPCP.all = 0x0000;

    EDIS;

    我会继续尝试定义中的其他东西。 我在固件开发包用户指南中遇到的一个问题是必须为外设启用时钟才能更改寄存器。

    低速时钟是否视为外设、您是否知道与它关联的时钟? 这似乎不是问题、因为我已经观察过 SYSCRTL 中的其他寄存器、例如 PCLKCR0成功更改、因此如果这些寄存器可以更改、我不确定是什么使 LOSPCP 有所不同。

    最后一个问题、您是否知道可以成功将 LOSPCP 更改为默认0x0002值以外的值的任何示例? 如果是、我可以尝试运行该代码、看看它是否能在我的器件上正常工作。

    此致、

    奥斯卡

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oscar、

    如果您使用的是驱动程序示例、则可以只需将您的代码与这些示例中的初始化   进行比较、就无需使软件过于复杂。 并且低速时钟不用作外设、因此我不认为这是一个可能的问题。

    让我和其他几位讨论这一点、以便在今天晚些时候给您更新。

    您是否已经尝试过在不更改任何 其他内容的情况下运行任何示例、仅添加代码以成功更改 LSPCLK 分频器?

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oscar、

    我们深入了这个地方,看到了"clk.c"文件中的一些特殊的东西。   在尝试按位"OR"为 LOSPCP 位分配新值之前, CLK_setLowSpdPreScaler()函数似乎没有清除 LOSPCP 位。 我认为这可能是  LOSPCP 保留其默认值的原因。 请尝试改为添加以下行(在"clk.c"或您的 main 中):

    //
    // CLK_setLowSpdPre定 标器-
    //

    CLK_setLowSpdPreScaler (CLK_Handle clkHandle、
    CONST CLK_LowSpdPreScaler_e 预分频器)
    {
    CLK_Obj * clk =(CLK_Obj *) clkHandle;

    enable_protected_register_write_mode;


    //
    //清除位
    //
    CLK->LOSPCP &=(~CLK_LOSPPCP_LSPCLK_BITS);


    //
    //设置位
    //
    CLK->LOSPCP |=预分频器;

    disable_protected_register_write_mode;

    返回;
    }

    请告诉我、您是否能够实施变革并看到行为上的差异!

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Allison:

    我只是尝试了 您的建议 、即运行一个示例、并且除了尝试更改 LOSPCP 之外什么都不做更改。 我导入了驱动程序版本"example_280src.c" Sci_Echoback、并添加到了 CLK_setLowSpdPreScaler(myClk, CLK_LowSpdPreScaler_SysClkOut_by_1);for(;;)循环前面。 很遗憾、我单步执行时 LOSPCP 寄存器没有改变。

    我还尝试了按照您的建议修改 clk.c。 它现在是什么:

    很遗憾、这也没有改变 LOSPCP。  

    我还在 main 中尝试了以下行、它们都未将 LOSPCP 从0x0002默认值更改为其他行。

    当 EALLOW 不工作时、我再次确认 EALLOW 实际上在更改 ST1、并确认它是:

    谢谢!

    奥斯卡

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oscar、

    在您更改了 clk.c 函数后、您是否也重新生成了 driverlib.lib?

    我认为这些项目使用 driverlib.lib 库来提取源代码(下图中的最后一个文件):

    但此 driverlib.lib 是预生成的、然后在导入工程时直接拉至 CCS。 如果您对用于生成 driverlib.lib 的任何源文件(包括 clk.c)进行了更改、则需要重新生成 driverlib.lib 才能使用更改进行更新。 为此、可导入 driverlib 项目、编辑 clk.c 并在 CCS 工作区中"构建"项目。 driverlib 项目位于 {C2000Ware}\device_support\f2802x\common\ccs。  

    您可以看到、我已将其导入、它使用我们需要更改的 clk.c 文件:

    请告诉我您是否能够这样做和/或您看到的这种更改。  

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Allison:

    很遗憾、当我逐步执行时、LOSPCP 仍然没有改变。  

    之前、我已经从 controlSUITE 目录将 driverlib 导入到我的项目(F28027_LVDT_R1)中、并且还没有将 driverlib 项目导入到我的工作区中。 为了遵循您的建议、我做了以下几点:
    1.导入了 driverlib.lib 项目并检查了 clk.c 是否具有您在最后一条消息中建议的修改。 请参阅下面的屏幕截图。

    2.重建 driverlib 项目。

    2. Re -将 driverlib.lib 文件添加到 F28027_LVDT_R1项目中,这次从 C2000Ware 目录中。

    3. 重新编译 F28027_LVDT_R1工程。

    4.调试了 F28027_LVDT_R1项目、并 在单步执行程序时观察了 LOSPCP 寄存器。

    如果我错过了任何步骤、请告诉我。

    我注意到在您的第一个屏幕截图中、您正在使用 F2802x_Headers_nonBIOS.cmd。 我之前没有包含此内容;现在我的项目如下:

    我是否应该使用  F2802x_Headers_nonBIOS.cmd?  

    我的开发板的时代是否与这个问题有关? 我在2018年购买了它、但直到最近才使用它。 该包装盒显示其生产日期为"Week:19/2017"。 从那时起、更改 LOSPCP 的能力是否已得到实施? 如果是、我可以尝试购买新的开发板。

    谢谢!

    奥斯卡

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oscar、

    我只是自己测试了这一点,以确定。 这是我做过的事:

    1. 我导入了一个简单的回显示区 SCI 示例({C2000Ware}\device_support\f2802x\examples\drivers\sci_echoback)
    2. 我添加了代码以更改 LOSPCP (我只是在 PLL_setup ()之后添加了它;如果您想知道):
      1.   CLK_setLowSpdPreScaler (myClk、CLK_LowSpd4552 Scaler_Sys Out_by_1);
    3. 我进入了 C2000Ware SDK ({C2000Ware}\device_support\f2802x\common\source\clk.c)来打开 clk.c、并将缺少的代码添加到函数中、然后保存文件:
    4. 我将 driverlib 工程导入到 CCS 工作区中、并选择用于"构建"driverlib 工程的按钮
    5. 我返回到 SCI 示例项目、右键点击项目文件夹、然后选择"Rebuild Project"来拉取更改。
    6. 然后、我重新加载了.out 文件并再次运行示例。 我"跑到" LOSPCP 行、然后"越过"该行、并看到 LOSPCP 正确变化:

    请告诉我您是否能够遵循这些步骤并使其正常工作-感谢您的耐心和毅力

    • 请注意、您还应该能够在 CLK_setLowSpdPre定 标 行处设置一个断点、然后使用"step into"按钮来验证工程引用的 clk.c 确实包含了正确版本的函数:

    希望这对您有所帮助! 我还将此作为错误归档、因此应在未来的 SDK 版本中修复。

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Allison:

    我能够使用相同的示例文件遵循您的说明、但当我单步执行 CLK_setLowSpdPreScaler LOSPCP 时未更改。
    当我尝试执行该指令时、我收到以下错误:  

    在"C:/Users/a0221343/Git/cs30_f2802x_f2802x0/f2802xX_common/source/clk.c "中找不到源文件
    找到文件或编辑源查找路径以包括其位置。

    我试图逐步浏览以观察进度箭头移动到解剖图、并注意到它跳过了008002行。 在我单步执行时、小蓝色箭头指向008001、然后在下一次单击"Step Into"时跳至008003。 我不确定这是否相关、但我认为可能相关。

    感谢您到目前为止提供的所有帮助!

    此致、

    奥斯卡  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我刚刚尝试了单击"Locate File"、并选择了 {C2000Ware}\device_support\f2802x\common\source 作为 CCS 的查找位置。  

    这在我不再获得"无法找到源文件..."的意义上起了作用 错误,但当我进入 clk.c 时,小蓝色进度箭头指向的行不在 CLK_setLowSpdPreScaler()中。  

    如果我在 clk.c 中向下滚动,它会显示 CLK_SetLowSpdPreScaler()以及修改后的指令,所以我也许会将 CCS 指向编辑后的 clk.c 文件,但 CCS 在加载项目至器件时并未使用该文件?

    我不确定这是否是一个好迹象、但当我查看 Project 树中的 include 文件夹并导航到 clk.c 文件时、软件会显示修改内容:

    尽管"无法找到源文件..." 错误消失、很遗憾、LOSPCP 仍然没有更改。

    此致、

    奥斯卡

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oscar、

    函数定义的来源实际上来自导入示例项目树最底部的 driverlib.lib 文件。 因此、尽管您展示的 clk.c 文件 在工程树中确实有更改、但遗憾的是、除非您重新编译 driverlib.lib 库("构建""driverlib"CCS 工程应使用您在 C2000ware 中对 clk.c 所做的任何新文件/更改重新生成 driverlib.lib。 然后、当你"重建"(而不仅仅是"构建")你的示例项目时、应该重新导入正确的 driverlib.lib 及其它文件来用你所做的改变来刷新它们)。  

    最后一个尝试的手段(我也尝试看到工作)。 将校正后的函数直接复制并粘贴至项目的 main.c 文件。 您可以更改该函数的名称(例如 CLK_setLowSpdPre定 标器) 2 ()) ,然后在代码中使用该新函数。 这样、当你调用它时、应用代码将使用更正后的函数。 您可以再次在 CLK_setLowSpdPre定 标器上设置一个断点。 2  然后单步执行/进入、查看 LOSPCP 是否相应地变化。

    //
    // CLK_setLowSpdPre定 标器-
    //

    CLK_setLowSpdPreScaler 2 (CLK_Handle clkHandle、
    CONST CLK_LowSpdPreScaler_e 预分频器)
    {
    CLK_Obj * clk =(CLK_Obj *) clkHandle;

    enable_protected_register_write_mode;


    //
    //清除位
    //
    CLK->LOSPCP &=(~CLK_LOSPPCP_LSPCLK_BITS);


    //
    //设置位
    //
    CLK->LOSPCP |=预分频器;

    disable_protected_register_write_mode;

    返回;
    }

    如果你尝试了这些东西,但仍然看到 LOSPCP 没有变化,那么让我们下一周设置一个快速的电话,以便我可以帮助你完成这些事情,并找出出了什么问题。 再次感谢您的坚持!

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Allison:

    操作成功! 从未见过0x0000如此令人兴奋!

    当我查找由导入的 driverlib 项目生成的文件时、问题得到了解决。 最初我是将来自 {C2000Ware}\device_support\F2802x\common\ccs\Debug 的 driverlib.lib 文件添加到我的 F28027_LVDT_R1项目中。 我在文件资源管理器中注意到、该 driverlib 文件的"上次修改"日期是2022年、这似乎可疑、因为所有的重建都应该在最近修改过它。

    我在导入的 driverlib 工程的 Debug 子文件夹中查看了 driverlib 文件的属性、发现在不同的位置生成了新的 driverlib 文件(修改日期更可信):

    将 driverlib 文件从{C2000Ware}\device_support\common\ccs\Debug\driverlib.lib 添加到我的项目中后、一切都按预期运行。

    谢谢你的所有帮助,这是我不会弄明白,没有你!

    我也很赞赏创建  CLK_setLowSpdPre定 标器的建议 2 ()函数。 这对我也很有效,是一个伟大的健全检查, LOSPCP 可以改变。

    此致、

    奥斯卡

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oscar、

    这是个好消息!! 很高兴你能够找到这个被更正的文件/通过在 main 中创建你自己的函数来对其进行验证。 正如我所提到的、我的确 记录了这个错误 、希望我们能够在以后的版本中为您和其他人解决此问题。 再次感谢您坚持使用它、希望您  也至少获得了其中一些调试技巧   

    如果您遇到任何其他问题、请随时打开另一个线程!  

    此致、

    艾里森