SPI 电子墨水显示屏与 PIC 18F46K22 连接时出现问题

2024-01-05

我正在使用一个图18F46K22 https://ww1.microchip.com/downloads/en/DeviceDoc/40001412G.pdf在 SPI 主模式下与Waveshare 1.54" 电子纸模组 https://www.waveshare.com/wiki/1.54inch_e-Paper_Module。 FOSC 内部频率为 8Mhz,SPI 配置为 FOSC/4。因此,当我检查逻辑分析仪上的输出时,某些输出位与预期不同。而且SCL也有一些偏差。

#include <xc.h>
#include "config.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include "main.h"

//#define _XTAL_FREQ 8000000
#define SPI1_DUMMY_DATA 0x0
#define SPI_RX_IN_PROGRESS 0x0
#define MY_BUFFER_SIZE 25

extern UBYTE EPD_Init(const unsigned char* lut);


unsigned char myWriteBuffer[100]="Hi I'm master..";
uint8_t myReadBuffer[100];
uint8_t total;
uint8_t temp;
uint8_t my_data = 0x58;

void UART_Init(void)
{
    //69
    SPBRG2 = 69;

    TXSTA2bits.BRGH = 1;
    BAUDCON2bits.BRG16 = 1; // Divisor at 8 bit

    TRISDbits.TRISD6 = 0;
    TRISDbits.TRISD7 = 1;

    RCSTA2bits.SPEN = 1; // Enable serial port    
    TXSTA2bits.SYNC = 0; // Async operation

    TXSTA2bits.TX9 = 0; // No tx of 9th bit
    RCSTA2bits.RX9 = 0; // No rx of 9th bit

    TXSTA2bits.TXEN = 1; // Enable transmitter
    RCSTA2bits.CREN = 1; // Enable receiver    
}

void UART_Putch(unsigned char bt)
{
    while (!PIR3bits.TX2IF); // hold the program till TX buffer is free
    TXREG2 = bt; //Load the transmitter buffer with the received value
}

void UART_Print(unsigned const char *ptr)
{
    while (*ptr != 0)
    {
        UART_Putch(*ptr++);
    }
}

unsigned char UART_getch() {
    unsigned char temp;
    if (RCSTA2bits.OERR) // check for Error 
    {
        RCSTA2bits.CREN = 0; //If error -> Reset
        //__delay_ms(10);
        RCSTA2bits.CREN = 1; //If error -> Reset 
    }
    while (!PIR3bits.RC2IF); // hold the program till RX buffer is free

    temp = RCREG2;
    return temp; //receive the value and send it to main function
}

void main() 
{
    ANSELA = 0;
    ANSELB = 0;
    ANSELC = 0;
    ANSELD = 0;
    
    TRISBbits.TRISB0 = 0; //RST Pin OUTPUT
    TRISBbits.TRISB1 = 0; //DC Pin OUTPUT
    TRISBbits.TRISB2 = 0; //CS Pin OUTPUT
    
    TRISBbits.RB3 = 1;  //BUSY Pin INPUT
        
//    int i;
    
    TRISD =0;/* PORT initialize as output */
    
    EPD_RST_PIN = 0;
    EPD_DC_PIN = 0;
     
    //OSCCON = 0x72;        /* Use internal osc. frequency 16 MHz */    
    
    OSCCONbits.SCS = 0b10;          //Frequency & PLL SETUP
    OSCCONbits.IRCF = 0b110;        //8 MHz
    while (!OSCCONbits.HFIOFS);
    
    OSCTUNEbits.PLLEN = 0;          //PLL disable

    
    UART_Init();


    
    SPI_Init_Master();      /* Initialize SPI communication as a master */   
    

  
    if(EPD_Init(lut_full_update) != 0) {
        UART_Print("e-Paper init failed\r\n");
        while(1);
    }
    UART_Print("e-Paper init\r\n");
    for(uint8_t i = 0; i < 10; i++){
    __delay_ms(10);
    }


    EPD_Clear();
    UART_Print("e-Paper cleared\r\n");
       for(uint8_t i = 0; i < 10; i++){
    __delay_ms(50);
    }
    

    while(1)
    {

        

//        total = 0;
//        //do
//        //{
//            LATAbits.LATA5=0;
//            //total = SPI1_Exchange8bitBuffer(SPI1_DUMMY_DATA, MY_BUFFER_SIZE, &myReadBuffer[total]);
//            total = SPI1_Exchange8bit(my_data);
//            
//            LATAbits.LATA5=1;
//            __delay_ms(500);
//            __delay_ms(500);
//            // Do something else...
//
//        //} while(total < MY_BUFFER_SIZE);
//            //while(1);
//           
//         EPD_Clear();
//    
//    __delay_ms(500);
    }
}

void SPI_Init_Master()
{
    /* PORT definition for SPI pins*/    
    TRISCbits.TRISC4 = 1;   /* RB0 as input(SDI) */
    TRISCbits.TRISC3 = 0;   /* RB1 as output(SCK) */
//    TRISBbits.TRISB2 = 0; /* RA5 as a output(SS') */
    TRISCbits.TRISC5 = 0;   /* RC7 as output(SDO) */

    /* To initialize SPI Communication configure following Register*/
    EPD_CS_PIN = 1;
    SSP1STAT=0x00;      /* Data change on rising edge of clk , BF=0*/
    SSP1CON1=0x20;      /* Slave mode,Serial enable, idle state high for clk */ 
    PIR1bits.SSP1IF=0;
    /* Disable the ADC channel which are on for multiplexed pin
    when used as an input */    
    ADCON0=0;           /* This is for de-multiplexed the SCL
                and SDI from analog pins*/
    ADCON1=0x0F;        /* This makes all pins as digital I/O */    
}

uint8_t SPI1_Exchange8bit(uint8_t data)
{
    // Clear the Write Collision flag, to allow writing
    SSP1CON1bits.WCOL = 0;

    SSP1BUF = data;

    while(SSP1STATbits.BF == SPI_RX_IN_PROGRESS)
    {
    }

    return (SSP1BUF);
}

uint8_t SPI1_Exchange8bitBuffer(uint8_t *dataIn, uint8_t bufLen, uint8_t *dataOut)
{
    uint8_t bytesWritten = 0;

    if(bufLen != 0)
    {
        if(dataIn != NULL)
        {
            while(bytesWritten < bufLen)
            {
                if(dataOut == NULL)
                {
                    SPI1_Exchange8bit(dataIn[bytesWritten]);
                }
                else
                {
                    dataOut[bytesWritten] = SPI1_Exchange8bit(dataIn[bytesWritten]);
                }

                bytesWritten++;
            }
        }
        else
        {
            if(dataOut != NULL)
            {
                while(bytesWritten < bufLen )
                {
                    temp = SPI1_Exchange8bit(SPI1_DUMMY_DATA);
                    
                    if(temp!=SPI1_DUMMY_DATA)
                    {
                        UART_Putch(temp);  //uart print
                        dataOut[bytesWritten] = temp;
                        bytesWritten++;
                    }
                    __delay_ms(5);
                }
            }
        }
    }

    return bytesWritten;
}

Compare your logic analyser SCK and MOSI timing with that specified for the part at https://www.waveshare.com/wiki/1.54inch_e-Paper_Module https://www.waveshare.com/wiki/1.54inch_e-Paper_Module: enter image description here

Note that the MOSI (SDIN) state must be stable on the rising edge of SCK (SCLK). In your case the MOSI transitions are synchronous with the rising edge, and you have a clock transition before the MOSI has the correct D7=0 state. SPI timing is defined by both clock polarity and clock phase - giving four possible clock modes. Compare the Waveshare timing diagram with the 18F46K22 datasheet https://ww1.microchip.com/downloads/en/DeviceDoc/40001412G.pdf: enter image description here

Waveshare 图表明可以使用 CKP=1/CKE=0 或 CKP=0/CKE=1,您有:

SSP1STAT=0x00 ;
SSP1CON1=0x20 ;

即 CKP=0/CKE=0(与逻辑分析仪迹线相关)。

您需要以下其中之一:

SSP1STAT=0x20 ; // CKE=1
SSP1CON1=0x20 ; // CKP=0

or

SSP1STAT=0x00 ; // CKE=0
SSP1CON1=0x30 ; // CKP=1

由于 SCK 的空闲状态(由 CKP 控制)是无关紧要的,因此我建议保持原样并使用第一个建议 - 这在某种程度上似乎更直观。

另请注意,您的逻辑分析仪还必须设置为相同的相位/极性时钟模式,才能正确显示数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SPI 电子墨水显示屏与 PIC 18F46K22 连接时出现问题 的相关文章

随机推荐

  • php+curl无法设置post方法

    我尝试使用 php 和curl 发出发布请求 这是我的代码 PHP 5 3 5 and curl 7 18 2 ch curl init if empty save cookie curl setopt ch CURLOPT COOKIEJ
  • Vuetify 多个 v-select 所需规则不起作用

    重现步骤 如果它的多个选择所需的规则不起作用 如果它不是多个也可以 预期行为 规则也适用于多重选择 实际行为 如果是多重选择 则规则不起作用 复制代码 div div
  • Json.NET - 控制类对象属性反序列化

    我有一个模特班Link它是用 JSON Net 反序列化的 public class Link JsonConstructor internal Link int id Id id public int Id get internal se
  • 迭代 std::set/std::map 的时间复杂度是多少?

    迭代一次的时间复杂度是多少std set std multiset std map std multimap 我相信它与集合 地图的大小是线性的 但不太确定 语言标准中有规定吗 在C 11工作草案中 可以找到答案 迭代器 要求 一般 p8
  • Visual Studio 2017 扩展开发

    您好 我想将我的扩展升级到 Visual Studio 2017 但我得到了Microsoft VisualStudio Shell RegistrationAttribute错误 但我已经添加了此引用 我在编译时收到此错误 是否有任何参考
  • JNI:拦截本机方法输出

    目前我正在开发一个项目 我需要拦截java本机方法调用的结果以进行进一步分析 有多种方法可以实现这一点 但我选择的方法是 在本机绑定时 将 java 本机方法的地址重新绑定到我自己的包装函数的地址 该函数将自行调用初始本机函数 然后返回其结
  • 将ListView的文本设置在中心 - android

    我尝试在中设置 ListView 的文本center的布局 我使用 LinearLayout 并设置重力 中心 但它总是显示在left 这是布局
  • GKE主节点

    在GKE中 当我们创建节点时 会有一个master节点 同时会创建很多worker节点 我怀疑主节点是我们创建的 提到的副本 还是GKE单独创建的主节点 gke 集群形成的拓扑结构 例如网状 星形 是什么 在 GKE 中 如果您创建一个标准
  • 将 freetype 位图复制到 opengl 纹理时出现问题

    我正在尝试生成字符的所有位图 to 并将它们添加到一个长纹理中 我打算将它们放置在固定宽度的纹理中 但现在我只想确保这个概念可行 But I am having problems Instead of getting the expecte
  • 在移动 Safari 中按 Tab 键浏览输入字段会使浏览器跳转

    有没有办法既能专注于球场 又不会出现这种不和谐的动画 当键盘可见时 这种行为尤其糟糕 Demo http plnkr co edit 9OydOFO0KUeKuaH8u70A p info http plnkr co edit 9OydOF
  • 设置graphql的最大文件上传大小(golang)

    我用 golang 编写了一个服务器 可以使用多部分形式将文件上传到该服务器 我想扩大最大上传大小 在我正在使用的实现的文档站点上 我发现了以下内容 上传最大尺寸 此选项指定用于将请求正文解析为 multipart form data 的最
  • 在显式结构中相互覆盖多个 CLR 引用字段?

    Edit 我很清楚这对于值类型非常有效 我的具体问题是关于将其用于引用类型 Edit2 我还知道您不能在结构中覆盖引用类型和值类型 这仅适用于相互覆盖多个引用类型字段的情况 我一直在修改 NET C 中的结构 我刚刚发现你可以这样做 usi
  • 确定代码圈复杂度的最佳工具[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • DataContractSerialiser 和 Serialized 的问题

    我有一些来自 Net 2 0 程序集的类 这些类被标记为可序列化 在我的项目中 我在我的 Classes 中使用这些类 它们标记有 DataContract IsReference true 和 DataMember 现在我遇到了问题 Da
  • 因为文档的框架是沙盒的并且未设置“允许脚本”权限

    我编写了一个程序 生成一个带有以下标头的 html 文件 但我没有iframe根本没有 更不用说在沙箱里了 当我在浏览器 托管在 Jenkins 服务器上 中打开页面时 我看不到 css 这些是错误 安全策略 我看过一些关于堆栈溢出的帖子
  • manifestPlaceholders 值不是字符串

    在我的 AndroidManifest xml 文件中 我有以下应动态填充的元数据标记
  • Redux Provider 不传递 Props/State

    我使用 create react app 创建了一个 React 应用程序 并向其中添加了 Redux 添加后
  • 为什么 wget 忽略 URL 中的查询字符串?

    我想使用wget下载以下18个HTML文件 http www ted com talks quick list sort date order desc page 18 http www ted com talks quick list s
  • StatsModels的predict函数如何与scikit-learn的roc_auc_score交互?

    我正在尝试理解predictPython statsmodels 中用于 Logit 模型的函数 它的文档是here https www statsmodels org stable generated statsmodels discre
  • SPI 电子墨水显示屏与 PIC 18F46K22 连接时出现问题

    我正在使用一个图18F46K22 https ww1 microchip com downloads en DeviceDoc 40001412G pdf在 SPI 主模式下与Waveshare 1 54 电子纸模组 https www w