用于MAX7456随屏显示器SPI

网友投稿 263 2022-11-13

用于MAX7456随屏显示器SPI

MAX7456串行接口

自动递增写模式,用于访问显示存储器,是一个8位操作(图3)。写数据前必须写入起始地址。对显示存储器执行自动递增写命令时,8位地址由内部产生,串口只需8位数据,如图3所示。 从显示存储器读字符数据时,若处于16位工作模式,应该是24位(8位地址+16位数据)。

C程序

下文给出的C程序已针对MAXQ2000微控制器进行了编译,用于MAX7456评估(EV)板。本文给出了完整的程序例程。程序是自述文档,几乎没有附加说明。C程序可从以下文件获得:spi.c和MAX7456.h。以下程序使用了SPI协议的标准定义,MAXQ2000处理器为SPI主机,MAX7456是SPI从器件。CS与MAX7456数据资料中的定义相同。SDIN对应于MOSI (主机出从器件入)。SDOUT对应于MOSI (主机入从器件出)。SCLK对应于CK。前缀SPI_用于全部程序。

数据结构

上述代码将一个单字节赋值给PO5,这是微控制器输出端口的地址。然后将另一个字节赋值给相同的可以逐位访问的存储器地址。因此,可用以下命令直接对该端口进行寻址:PO5 = 0x10;或用以下命令逐位读写:PO5_bit.bit4 = 1;如果该程序用于其它处理器,该结构需要重新编写。如果采用不支持位字段宽度的老式C编译器,可用位布尔运算设置及清除位:

/* Portable bit-set and bit-clear macros. */#define BIT_SET(sfr,bitmask) sfr |= (bitmask)#define BIT_CLR(sfr,bitmask) sfr &=~ (bitmask)#define BIT0 0x01#define BIT1 0x02#define BIT2 0x04#define BIT3 0x08#define BIT4 0x10#define BIT5 0x20#define BIT6 0x40#define BIT7 0x80example: BIT_SET(PO5,BIT0); BIT_CLR(PO5,BIT6);

以下是一个简单的编程技巧,使程序更容易移植:用宏定义控制器引脚排列,如下所示。

单字节写操作程序

单字节写操作(图1)程序如下所示。如果可以保证在程序入口处的/CS和CK线状态正确,可以去掉前两条命令。程序首先发送地址,然后发送数据。进行两次循环。采用单循环及16位数据存储可以简化程序。在MAXQ2000微控制器中执行16位“int”所占用的时间比执行8位“char”长,因此需进行权衡考虑。

读字节操作程序

读字节操作(图2)程序如下所示,与上述程序类似。首先发送地址,然后发送时钟从MISO读回数据。

/************************************************************************************** * spiReadReg * * Reads an 8-bit register with the SPI port. * Data is returned. **************************************************************************************/unsigned char spiReadReg (const unsigned char regAddr){ unsigned char SPICount; // Counter used to clock out the data unsigned char SPIData; SPI_CS = 1; // Make sure we start with active-low CS high SPI_CK = 0; // and CK low SPIData = regAddr; // Preload the data to be sent with Address and Data SPI_CS = 0; // Set active-low CS low to start the SPI cycle for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Address and Data { if (SPIData & 0x80) SPI_MOSI = 1; else SPI_MOSI = 0; SPI_CK = 1; SPI_CK = 0; SPIData <<= 1; } // and loop back to send the next bit SPI_MOSI = 0; // Reset the MOSI data line SPIData = 0; for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be read { SPIData <<=1; // Rotate the data SPI_CK = 1; // Raise the clock to clock the data out of the MAX7456 SPIData += SPI_MISO; // Read the data bit SPI_CK = 0; // Drop the clock ready for the next bit } // and loop back SPI_CS = 1; // Raise CS return ((unsigned char)SPIData); // Finally return the read data}

自动递增模式下的写字节操作程序

自动递增模式下的写字节操作(图3)程序如下所示,与和上述单字节写程序类似。首先发送地址,然后发送时钟从MISO读回数据。

/************************************************************************************** * spiWriteRegAutoIncr * * Writes to an 8-bit register with the SPI port using the MAX7456's autoincrement mode **************************************************************************************/void spiWriteRegAutoIncr(const unsigned char regData){ unsigned char SPICount; // Counter used to clock out the data unsigned char SPIData; // Define a data structure for the SPI data. SPI_CS = 1; // Make sure we start with active-low CS high SPI_CK = 0; // and CK low SPIData = regData; // Preload the data to be sent with Address and Data SPI_CS = 0; // Set active-low CS low to start the SPI cycle for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Address and Data { if (SPIData & 0x80) SPI_MOSI = 1; else SPI_MOSI = 0; SPI_CK = 1; SPI_CK = 0; SPIData <<= 1; } // and loop back to send the next bit SPI_MOSI = 0; // Reset the MOSI data line}

自动递增模式下写显示存储器的程序

自动递增模式下写显示存储器的程序如下,程序使用称为 "data"的全局变量数组。定义如下:

extern volatile unsigned char data[DATA_BUF_LENGTH];DATA_BUF_LENGTH = 968

调用程序时,data[]包含显示存储器内容,格式如下:

data[0] = ignored (contains a command byte used by the EV kit GUI software)data[1] = character byte 1data[2] = attribute byte 1data[3] = character byte 2data[4] = attribute byte 2etc.

自动递增模式通过写0xFF结束,所以该模式下不能向显示寄存器写0xFF。如果需要写OxFF,可以采用单字节写指令。

写字符存储器程序

向字符存储器写一个字符的程序如下,每个字符占用18行,每行12像素,共216像素。由于每个字节定义4个像素,因此定义每一个字符需要54字节。字符数据位于程序入口处的data[] (与上述写显示存储器的程序类似)。写字符存储器时需要进行一些附加说明,存储器为非易失,因此,写存储器大约需要12ms,由MAX7456执行。只有完整的54字节字符才可以写入字符存储器。该器件包含一个54字节映射存储器。首先把需要写入的字符数据写入映射存储器,然后器件将该数据装载到NVM字符存储器。用来写字符存储器的寄存器有以下几种:

字符存储器模式 = 0x08。向寄存器写0xA0,使器件把映射存储器的内容装载到NVM字符存储器。 字符存储器地址高位 = 0x09。包括了即将写入字符的地址。 字符存储器地址低位 = 0x0A。 字符存储器数据输入 = 0x0B。 Status = 0xA0,读取该寄存器以决定何时可以写入字符存储器。

在程序入口处,data[1]包括即将写入字符的地址,data[2...54]包括字符数据。向NVM字符存储器写字符时,首先写字符地址。然后将每个字节写入映射存储器。写映射存储器时没有自动递增模式,所以每次写操作必须写入映射存储器地址。向字符存储器模式寄存器写0xA0,可以把映射存储器的内容装载到NVM字符存储器。然后器件将状态寄存器第5位置高,表明不能写入字符存储器。完成后,器件将该位复位至低。数据从映射存储器移向字符存储器时不能写映射存储器。为了避免出现显示器闪烁,在写字符存储器之前程序禁止了OSD。

MAX7456头文件

下面列出了MAX7456的头文件,以下代码决定了器件的寄存器映射。

结论和性能

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:开贴和大家讨论如何选择云计算服务商
下一篇:云计算硬件交换设备参数配置考虑
相关文章

 发表评论

暂时没有评论,来抢沙发吧~