PicoCoreMX6UL100 Rev. 1.00 and touch screen FT5x06

  • Hi everyone,


    on the PicoCoreMX6UL100 Rev. 1.00 board, the touch screen FT5x06 does not work well - it looks like the I2C connection is working with errors. I assume that the ft5x0x_i2c_rxdata() function from in ft5x06_ts.c is not working correctly.


    In the console, when I click on the touch screen, I see the following: "ft5x06_ts_v2 2-0038: Error reading touch screen data: -110". But sometimes it still works right. With an oscilloscope, I do not see anything abnormal on the I2C bus (J1 pin 3 I2C_B_SCL and J1 pin 5 I2C_B_SDA) and pins I2C_B_IRQn (J1 pin 1) and I2C RESET (J1 pin 2).


    The touch screen is configured in picocoremx6ul100.dts as follows:



    The I2C_B is configured in picocoremx6ul100.dts as follows:



    The logic analyzer shows that when you click on the touch screen, the first interrupt begins to be processed (the transfer via I2C begins). But the transfer ends after reading the first byte (sometimes even earlier, sometimes after reading several bytes) with the condition "I2C Stop". The controller of the touch screen continues to generate interrupts approximately once every 10 ms, but this is not reflected in the I2C bus in any way. After about 100 ms, the I2C transmission starts again and is interrupted again as well. And only occasionally all 15 bytes are read. The same touch screen on another efus boards (efus A9X and efus A7UL) works correctly and all 15 bytes are read after each interrupt, i.e. approximately every 10 ms. If you replace the ft5x0x_ts_ist() (in ft5x06_ts.c) handler with


    then using the logic analyzer you can see that this handler is called after each interrupt, as it should be. From which it can be assumed that the ft5x0x_i2c_rxdata() function is too slow and usually fails.


    What can I do to fix this problem?


    Thanks in advance

  • -

    Do you have any extra load on the CPU?

    - no, anyway I didn't run anything at all


    # top

    Mem: 60508K used, 446776K free, 164K shrd, 4656K buff, 9900K cached

    CPU: 0% usr 0% sys 0% nic 99% idle 0% io 0% irq 0% sirq

    Load average: 0.00 0.00 0.00 1/74 190

    PID PPID USER STAT VSZ %VSZ %CPU COMMAND

    190 183 root R 2732 1% 1% top

    98 2 root SW 0 0% 0% [kworker/0:2]

    181 1 root S 6332 1% 0% /usr/sbin/sshd

    146 1 root S 3120 1% 0% /sbin/udevd -d

    168 1 dbus S 2968 1% 0% dbus-daemon --system

    183 1 root S 2732 1% 0% -sh

    1 0 root S 2604 1% 0% init

    140 1 root S 2604 1% 0% /sbin/syslogd -n

    144 1 root S 2604 1% 0% /sbin/klogd -n

    105 2 root SW 0 0% 0% [mmcqd/1]

    18 2 root SW 0 0% 0% [kworker/0:1]

    99 2 root SW 0 0% 0% [mmcqd/0]

    7 2 root SW 0 0% 0% [rcu_preempt]

    11 2 root SW 0 0% 0% [kdevtmpfs]

    100 2 root SW 0 0% 0% [kworker/0:3]

    109 2 root SW 0 0% 0% [mmcqd/1boot1]

    113 2 root SW< 0 0% 0% [kworker/0:1H]

    2 0 root SW 0 0% 0% [kthreadd]

    3 2 root SW 0 0% 0% [ksoftirqd/0]

    4 2 root SW 0 0% 0% [kworker/0:0]



    Which Display are you using?

    480x272 RGB

  • Hello,


    no, we have our own PCB. The cause of the error was found.

    The "I2C Stop" condition was created by the touchscreen controller (slave on the I2C bus), and not the PicoCore (master on the I2C bus), which does not correspond to the I2C specification.

    So everything works as it should with a working touchscreen.


    Thanks for the help.