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.

TMS320F280049C: 使用sysconfig配置硬件SPI驱动OLED产生的问题

Part Number: TMS320F280049C
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

问题描述:在使用硬件SPI驱动OLED屏幕时出现了花屏的现象,而且示波器中似乎对SPI的解码表明它很容易出现错误,在下面的OLED.init函数中发送的十六进制数前几个是对的,但是会从某个开始解码与代码的值不相符.

以下是详细的配置与代码

1.在dev.ti.com/.../explore 上我没有看到有关sysconfig配置硬件SPI的详细教程

2.我自己配置的SPI如下图所示

4.OLED.c文件:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
* OLED.c
*
* Created on: 202558
* Author: EFBR
*/
#include "board.h"
#include "sys.h"
#include "OLED.h"
#include "oledfont.h"
#define SPI_STS_TX_EMPTY 0x00000020 //
uint16_t OLED_GRAM[144][8];
uint16_t move_bite = 8;
//
void OLED_ColorTurn (uint16_t i)
{
if (i == 0) {
OLED_WR_Byte (0xA6, OLED_CMD); //
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

5.OLED.h文件

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
* OLED.h
*
* Created on: 202546
* Author: EFBR
*/
#include "board.h"
#ifndef OLED_H_
#define OLED_H_
//-----------------OLED----------------
/*:TI:
**POCI-->MISO
**PICO-->MOSI
**PTE-->CS*/
// #define OLED_SCL_Clr() GPIO_writePin(OLED_CLK,0)//SCL
// #define OLED_SCL_Set() GPIO_writePin(OLED_CLK,1)
// #define OLED_SDA_Clr() GPIO_writePin(OLED_MOSI,0)//SDA
// #define OLED_SDA_Set() GPIO_writePin(OLED_MOSI,1)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

6.oledfont.h文件

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef __OLEDFONT_H
#define __OLEDFONT_H
const unsigned char asc2_0806[][6] =
{
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},// sp
{0x00, 0x00, 0x00, 0x2f, 0x00, 0x00},// !
{0x00, 0x00, 0x07, 0x00, 0x07, 0x00},// "
{0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14},// #
{0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12},// $
{0x00, 0x62, 0x64, 0x08, 0x13, 0x23},// %
{0x00, 0x36, 0x49, 0x55, 0x22, 0x50},// &
{0x00, 0x00, 0x05, 0x03, 0x00, 0x00},// '
{0x00, 0x00, 0x1c, 0x22, 0x41, 0x00},// (
{0x00, 0x00, 0x41, 0x22, 0x1c, 0x00},// )
{0x00, 0x14, 0x08, 0x3E, 0x08, 0x14},// *
{0x00, 0x08, 0x08, 0x3E, 0x08, 0x08},// +
{0x00, 0x00, 0x00, 0xA0, 0x60, 0x00},// ,
{0x00, 0x08, 0x08, 0x08, 0x08, 0x08},// -
{0x00, 0x00, 0x60, 0x60, 0x00, 0x00},// .
{0x00, 0x20, 0x10, 0x08, 0x04, 0x02},// /
{0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E},// 0
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

7.main.c文件中的调用

void main (void)
{
    Device_init();
    Interrupt_initModule();
    Interrupt_initVectorTable();

    Board_init();
    Interrupt_enableMaster();
    uint16_t t = ' ';
    // delay_init();
    OLED_Init();
    OLED_ColorTurn (0);    // 0正常显示,1 反色显示
    OLED_DisplayTurn (0);  // 0正常显示 1 屏幕翻转显示
    while (1) {

        OLED_Refresh();
        Delay_ms (500);
        // OLED_Clear();
        // OLED_ShowChinese (0, 0, 0, 16, 1);    // 中
        // OLED_ShowChinese (18, 0, 1, 16, 1);   // 景
        // OLED_ShowChinese (36, 0, 2, 16, 1);   // 园
        // OLED_ShowChinese (54, 0, 3, 16, 1);   // 电
        // OLED_ShowChinese (72, 0, 4, 16, 1);   // 子
        // OLED_ShowChinese (90, 0, 5, 16, 1);   // 技
        // OLED_ShowChinese (108, 0, 6, 16, 1);  // 术
        // OLED_ShowString (8, 16, "ZHONGJINGYUAN", 16, 1);
        // OLED_ShowString (20, 32, "2014/05/01", 16, 1);
        // OLED_ShowString (0, 48, "ASCII:", 16, 1);
        // OLED_ShowString (63, 48, "CODE:", 16, 1);
        // OLED_ShowChar (48, 48, t, 16, 1);  // 显示ASCII字符
        // t++;
        // if (t > '~')
        //     t = ' ';
        // OLED_ShowNum (103, 48, t, 3, 16, 1);
        // OLED_Refresh();
        // Delay_ms (500);
        // OLED_Clear();
        // OLED_ShowChinese (0, 0, 0, 16, 1);    // 16*16 中
        // OLED_ShowChinese (16, 0, 0, 24, 1);   // 24*24 中
        // OLED_ShowChinese (24, 20, 0, 32, 1);  // 32*32 中
        // OLED_ShowChinese (64, 0, 0, 64, 1);   // 64*64 中
        // OLED_Refresh();
        // Delay_ms (500);
        // OLED_Clear();
        OLED_ShowString (0, 20, "A", 8, 1);    // 6*8 “ABC”
        // OLED_ShowChar(20,20,"A",8,1);
        //OLED_ShowString (20, 20, "ABC", 12, 1);   // 6*12 “ABC”
        // OLED_ShowString (0, 20, "ABC", 16, 1);  // 8*16 “ABC”
        // OLED_ShowString (0, 36, "ABC", 24, 1);  // 12*24 “ABC”
        // OLED_Refresh();
        Delay_ms (500);
        // OLED_ScrollDisplay (11, 4, 1);
    }

8.实际效果

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 首先检查SPI配置参数,特别是时钟极性和相位。降低SPI速率测试,速率过高会导致信号失真。

    检查数据位宽和传输模式。

    使用示波器检查信号质量,走线是否过长或存在干扰。

    检查代码中的传输逻辑和等待机制。

    逐步调试和验证每个环节,直到找到问题根源。

    例子可以到下面路径找一下

    [C2000ware path]/driverlib/f28004x/examples/spi/

  • 这是我示波器其中一次解码的信号

    SPI  Time  MISO  MOSI 
    1 -2.80200us    0xAE
    2 398.000ns    0x00
    3 3.59800us    0x10
    4 6.79800us    0x40
    5 9.99800us    0x81
    6 13.1980us    0xCF
    7 16.3980us    0xA1
    8 19.5980us    0xC8
    9 22.7980us    0xA6
    10 25.9980us    0xA8
    11 29.1960us    0x3F
    12 32.3980us    0xD3
    13 35.5980us    0x00
    14 38.7980us    0xD5
    15 41.9960us    0x80
    16 45.1980us    0xD9
    17 48.3980us    0xF1
    18 51.5980us    0xDA
    19 54.7980us    0x12
    20 57.9980us    0xDB
    21 61.1980us    0x40
    22 64.3960us    0x20
    23 67.5960us    0x02
    24 70.7960us    0x8D
    25 73.9960us    0x14
    26 77.1960us    0xA4
    27 80.3960us    0xA6
    28 83.5960us    0xAF

    下面两张图是示波器捕获的波形

    但是这次测试时OLED直接就不显示了,参数是和上次提交时的一致

  • 请按照上面给出的思路进行具体分析。

  • 表格里面是捕获的OLED初始化时280049对OLED发送的数据,也就是下面这段函数

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /*OLED*/
    void OLED_Init()
    {
    // OLED_RES_Set();
    // Delay_ms(100);
    OLED_RES_Clr();
    Delay_ms(200);
    OLED_RES_Set();
    OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
    OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
    OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
    OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
    OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
    OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
    OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0 0xa1
    OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0 0xc8
    OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
    OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
    OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
    OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    上次捕获的表格中的数据都是正确的,这次我又重新捕获了几次初始化的数据,但是现在从第一个数据开始就不对了,数据如下表格中的所示

    1 -2.80200us    0xDC
    2 398.000ns    0x00
    3 3.60000us    0x20
    4 6.79800us    0xC1
    5 10.0000us    0x03
    6 13.1980us    0x9F
    7 16.3980us    0x43
    8 19.5980us    0x91
    9 22.7980us    0x4F
    10 25.9980us    0x50
    11 29.1980us    0x7F
    12 32.3980us    0xA6
    13 35.5980us    0x01
    14 38.7980us    0xAB
    15 41.9980us    0x01
    16 45.1980us    0xB3
    17 48.3980us    0xE3
    18 51.5980us    0xB4
    19 54.7980us    0x25
    20 57.9980us    0xB6
    21 61.1980us    0x80
    22 64.3980us    0x40
    23 67.5980us    0x05
    24 70.7980us    0x1A
    25 73.9980us    0x29
    26 77.1980us    0x6D
    27 80.3980us    0x4D

    我现在猜测是由于SPI传输乱码导致的,但是现在不清楚是不是我在SPI发送时使用了错误的函数还是SPI初始化配置存在问题,如果前面的错误不存在,我想要如何能够降低SPI的误码率,这样方便我进行下一步的测试

  • 硬件方面可以优化PCB布局,包括缩短走线长度等。

    另外,可以先降低时钟速率看看。

  • 问题已经解决了,DC引脚虚焊导致屏幕对命令和数据的接收出问题,同时一些初始化的配置也存在问题,现在都纠正了