1312月 2019

0

159

0

CYPRESS TMA54X/CY8CTMA54X 驱动调试

TMA54X使用I2C通信,但是有别于其他TP芯片,TMA54X使用了一个叫PIP(Packet Interface Protocol)的协议。

至于PIP协议到底是一个什么玩意,不如看通信时序来得直观。

手册指示的操作流程如下:

1. 设备上电后会自动复位,并在COMM_INT引脚产生一个最大18ms的中断信号,逻辑分析仪下的信号如下SCL、SDA拉高,Channel2(COMM_INT)产生两个脉冲):

2.初始化程序中,需要读两个字节,返回值都为0x00,自此,COMM_INT被拉高,TP进入Application模式

3.当TP有触摸操作时,中断产生,COMM_INT拉低,这时Host开始读数据,数据包格式参考手册


硬件平台使用的是MT2503,初始化及读数据包代码如下:

 

 

kal_bool ctp_cy8cttma54x_init(void)
{
	ctp_i2c_start();
	ctp_i2c_send_byte(0x49);
	ctp_i2c_receive_byte(0);
	ctp_i2c_receive_byte(1);
	ctp_i2c_stop();

	CTP_delay_ms(400);

	ctp_i2c_start();

	ctp_i2c_send_byte(0x49);
	ctp_i2c_receive_byte(0);
	ctp_i2c_receive_byte(1);
	ctp_i2c_stop();

	return KAL_TRUE;
}

typedef __packed struct {
	uint16_t length;
	uint8_t report_id;
	uint16_t timestamp;
	uint8_t b5;
	uint8_t b6;
} touch_report_t;

typedef __packed struct {
	uint8_t r5_touch_type;
	uint8_t tip1_eventid2_touchid5;
	uint16_t x;
	uint16_t y;
	uint8_t pressure;
	uint8_t major_axis_len;
	uint8_t minor_axis_len;
	uint8_t orientation;
} touch_record_t;

kal_bool ctp_cy8cttma54x_get_data(TouchPanelMultipleEventStruct *tpes)
{
	struct {
		touch_report_t touch_report;
		touch_record_t touch_record[3];
	} recv_packet;

	kal_uint8 *p_recv = (kal_uint8 *)&recv_packet;
	kal_uint8 i;
	kal_bool ret = KAL_FALSE;
	
	ctp_i2c_start();
	ctp_i2c_send_byte(0x49);

	*p_recv++ = ctp_i2c_receive_byte(0);
	*p_recv++ = ctp_i2c_receive_byte(0);

	if (recv_packet.touch_report.length <= sizeof(recv_packet)) {
		i = recv_packet.touch_report.length - 3;
		while (i--) {
			*p_recv++ = ctp_i2c_receive_byte(0);
		}
		*p_recv = ctp_i2c_receive_byte(1);
	}

	ctp_i2c_stop();

	if (recv_packet.touch_report.report_id == 0x01) {
		kal_uint8 num_of_records = recv_packet.touch_report.b5 & 0x1F;
		
		if (num_of_records > 3) num_of_records = 3;
		for (i=0; i<num_of_records; i++) {
			kal_prompt_trace(MOD_TP_TASK, "------- record index = %d, (%d, %d)", i, recv_packet.touch_record[i].x, recv_packet.touch_record[i].y);
			tpes->points[i].x = recv_packet.touch_record[i].y;
			tpes->points[i].y = recv_packet.touch_record[i].x;
		}

		tpes->time_stamp = (kal_uint16)L1I_GetTimeStamp();
		tpes->padding = CTP_PATTERN;
		tpes->model = num_of_records;

		if (num_of_records) {
			if (recv_packet.touch_record[0].tip1_eventid2_touchid5 & 0x80) {
				ret = KAL_TRUE;
			}
		}
	}

	return ret;
}

Comments (0)