我使用了CC2640R2F的硬件SPI对 9PIN的 OLED进行通信,这款OLED内含了GT20L16S1Y字库芯片和SSD1309。在发送数据给SSD1309能正常的显示BMP图片,
但是在显示中文的时候RX一直没有数据,在逻辑分析仪上已经显示成功切换片选切发送了数据,但是就是没有数据的返回。已知字库芯片上的最高支持的时钟频率为30MHZ,主机设置的params.bitRate = 300000。能分析分析到底是哪里出现问题了吗?
void OLED_WR_Byte(u8 dat,u8 cmd) {bool data_status = false;if(CSNpin != OLED_CSN_STATUS){//更换片选SPI_control(handle, ***, &csnPin0);CSNpin = OLED_CSN_STATUS;}transmitBuffer[0] = dat;transaction.count = 1;transaction.txBuf = transmitBuffer;transaction.rxBuf = NULL;transaction.arg = NULL;if(cmd)OLED_DC_Set();else{OLED_DC_Clr();}// Open the SPI and perform the transfer// handle = SPI_open(Board_SPI, ¶ms);data_status = SPI_transfer(handle, &transaction);if(data_status == false){Log_error0("Error SPI_send!");}/* if(data_status == true && cmd == OLED_DATA){// Log_info1("oled send msg: %u ",transmitBuffer[0]);}*///拉高DCOLED_DC_Set(); } //发送一个字节到GT20L16S1Y void Send_Command_to_ROM(u8 dat) {int ret;if(CSNpin != ROM_CSN_STATUS){//更换片选ret = SPI_control(handle, ***, &csnPin1);CSNpin = ROM_CSN_STATUS;}transmitBuffer[0] = dat;transaction.count = 1;transaction.txBuf = transmitBuffer;transaction.rxBuf = NULL;transaction.arg = NULL;// Open the SPI and perform the transfer// handle = SPI_open(Board_SPI, ¶ms);SPI_transfer(handle, &transaction);if(CSNpin == ROM_CSN_STATUS){Log_info1("rom send msg: %u ",transmitBuffer[0]);} } //从GT20L16S1Y获得一个字节 u8 Get_data_from_ROM(void) {int ret=0;bool data_status = false;u8 read=0;if(CSNpin != ROM_CSN_STATUS){ret = SPI_control(handle, ***, &csnPin1);if(ret != SPI_STATUS_SUCCESS){Log_error0("Error Get_data_from_ROM");}CSNpin = ROM_CSN_STATUS;}transaction.count = 1;transaction.txBuf = NULL;transaction.rxBuf = receiveBuffer;data_status = SPI_transfer(handle, &transaction);if(data_status == false){Log_error0("Error SPI_send!");}elseLog_info1("ROM_read_data %U",receiveBuffer[0]);read = receiveBuffer[0];return read; }
最后是SPI的初始化:
SPI_init();
SPI_Params_init(¶ms);
params.bitRate = 300000;
params.frameFormat = SPI_POL0_PHA0;
params.mode = SPI_MASTER;
params.dataSize = 8;
handle = SPI_open(Board_SPI0, ¶ms);
if(handle == NULL)
{
Log_error0("Error SPI_open!");
}
user6359397:
附上逻辑分析仪的图片
Kevin Qiu1:
回复 user6359397:
只有中文无法显示吗? 英文字符和数字可以吗
user6359397:
回复 Kevin Qiu1:
商家提供的OLED代码除了BMP图以外所有的数字和字符都要从GT20L16S1Y字库芯片获取字符信息来显示,BMP图片是可以正常显示的
Kevin Qiu1:
回复 user6359397:
如果图片可以正常显示,那你看一下字体取模数组部分的程序是否正确,主要看一下OLED的驱动程序。
另外你可以将SPI传输数据打印到串口上,看下SPI部分是否正常
user6359397:
回复 Kevin Qiu1:
SPI传输主机发送的结果打印出来是正常的,示波器上显示也成功发送了,但是MISO的波形没有,接收不到数据,OLED一直是黑屏
user6359397:
回复 Kevin Qiu1:
用的是SPI_control来切换片选,示波器上也显示我成功切换了片选,也发送数据了,发送的数据串口打印也是对的,但是rxBuf一直没有数据
Kevin Qiu1:
回复 user6359397:
串口打印SPI发送正常的话,之前图片可以显示,应该不是SPI的问题,所以可能是OLED的驱动部分的问题,你再看一下 OLED硬件部分的资料吧
Kevin Qiu1:
回复 user6359397:
在C:\ti\simplelink_cc2640r2_sdk_4_10_00_10\examples\rtos\CC2640R2_LAUNCHXL\drivers\spimaster和spislave的例程,对照一下配置是否正确
user6359397:
回复 Kevin Qiu1:
本来在字库芯片手册上的时序图描述里,MCU发送完数据的下一个时钟周期字库芯片就返回数据了,但是在用硬件SPI的时候,SPI在传输完数据到接收数据中间会有一个片选信号拉高的操作,这可能就导致了返回数据的丢失,我现在在想如何使用硬件SPI的时候保持片选信号一直是低电平?
Kevin Qiu1:
回复 user6359397:
可以切换为软件片选,控制输出为低电平