SuperARM显示实验注意要点
有客户在做SuperARM显示实验遇到了这样的问题,就是在数码管和LCD同时显示时,很容易出现显示错乱。为此我们特别为客户编写了“综合实验3“,以显示我们的产品没有任何问题。同时我们也针对此现象作如下解释:
数码管和LCD的数据传输都是用的芯片的SSP1功能,其中P0.22(CS0)用于片选连接LCD数据口的74HC595,P0.24(CS1)用于片选连接LCD数据口的74HC595。他们共同调用函数:void InitializeSSP(void)和int8u SSP_SendData(int32u SPI_CS,int8u data)完成SSP得初始化和数据传送。
有一点书要注意,完成一次刷屏,需要多次调用SSP_SendData( ),这样就有可能发生这样的情况,正在执行刷屏调用SSP_SendData( ),此函数执行到中途,此时发生了任务切换,然后跳入数码管调用SSP_SendData( ),这事就可能会出
现显示错乱。
要解决这样的问题有多种方法,现边说两种简单的。
1.建立一个互斥信号量,用于控制程序对函数SSP_SendData( )的访问,只要有函数调用SSP_SendData( ),互斥信号量就标记为不可用。防止重入。
2.采用临介区代码的方法:在进入SSP_SendData( )函数时,关中断,退出时开中断。具体代码如下:
/******************************************************************************
* 函数名称:SSP_SendData()
* 函数功能:SSP接口向SPI总线发送数据。
* 入口参数:data 待发送的数据
* 出口参数:返回值为读取的数据
*****************************************************************************/
int8u SSP_SendData(int32u SPI_CS,int8u data)
{
int16u temp;
OS_ENTER_CRITICAL(); //关中断
Set_Output(SPI_CS,0); // 片选SPI
SSPDR = data;
while( (SSPSR & 0x01) == 0 ); // 等待TFE置位,即发送FIFO空
while( (SSPSR & 0x04) == 0 ); // 等待TFE置位,即发送FIFO空
temp = SSPDR;
Output(SPI_CS,1);
OS_EXIT_CRITICAL(); //开中断
return(temp);
}