TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2640R2F SPI接收不slave的数据

我使用了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, &params);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, &params);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(&params);
    params.bitRate     = 300000;
    params.frameFormat = SPI_POL0_PHA0;
    params.mode        = SPI_MASTER;
    params.dataSize    = 8;
    handle = SPI_open(Board_SPI0, &params);
    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:

可以切换为软件片选,控制输出为低电平

赞(0)
未经允许不得转载:TI中文支持网 » CC2640R2F SPI接收不slave的数据
分享到: 更多 (0)