Skip to content

I2CPeripheral fails to send bytes of certain integer range #3316

Closed
@k3wals

Description

@k3wals

Issue
Peripheral fails to send bytes when of certain range, spaced out by 128.
0-127 -> Can send
128-254 -> Cannot send
255-511 -> Can send
etc.

I'm using an iMX6UL based linux host as the host to make the requests
while true; do i2cget -y 1 0x0b 0x14 w; sleep 0.05;done

Hardware/Software
Have tried on a GrandCentral M4, and Trinket M0, same results. I've tried v4.3.1, v5.3.1, and latest v6.

Observations

  • The span at which the transfers take place and do not are 128 bytes apart
  • Changing to big endian bytes seems to alleviate the problem (at least in the low integer ranges, need to go full range)
  • When bytes not being sent, I noticed it's getting stuck on if (!self->sercom->I2CS.INTFLAG.bit.DRDY) in ports/atmel-samd/common-hal/i2cslave/I2CSlave.c

Code to reproduce

from i2cperipheral import I2CPeripheral
import time

regs = [0] * 16
index = 0
reg_check = 0

def decimalToBinary(n):  
    return bin(n).replace("0b", "") 

while True:
    with I2CPeripheral(board.SCL, board.SDA, (0x0b, 0x41)) as slave:
        while True:
            r = slave.request()
            if not r:
                # Maybe do some housekeeping
                continue
            with r:  # Closes the transfer if necessary by sending a NACK or feeding the master dummy bytes
                if r.address == 0x0b:
                    # print("address 0x0b")
                    if not r.is_read:  # Master write which is Slave read
                        b = r.read(1)

                    elif r.is_restart:  # Combined transfer: This is the Master read message
                        # print("Restart")
                        n = r.write(int.to_bytes(reg_check,2,'little')) #FAILS TO WRITE PACKETS AFTER 127, BIG endians seems to be OK
                        reg_check +=1
                        print("n is ", n, " for regcheck ", hex(reg_check), " ", reg_check, " ", decimalToBinary(reg_check))

                        # fix  to help prevent SDA/SCL lockup after prolonged use
                        time.sleep(0.01)
                        r.close()
                        break

Console Output
when "n is 1", the bytes are not written to I2C bus as observed with a Saleae Logic.

n is  2  for regcheck  0x1   1   1
n is  2  for regcheck  0x2   2   10
n is  2  for regcheck  0x3   3   11
n is  2  for regcheck  0x4   4   100
n is  2  for regcheck  0x5   5   101
n is  2  for regcheck  0x6   6   110
n is  2  for regcheck  0x7   7   111
n is  2  for regcheck  0x8   8   1000
n is  2  for regcheck  0x9   9   1001
n is  2  for regcheck  0xa   10   1010
n is  2  for regcheck  0xb   11   1011
n is  2  for regcheck  0xc   12   1100
n is  2  for regcheck  0xd   13   1101
n is  2  for regcheck  0xe   14   1110
n is  2  for regcheck  0xf   15   1111
n is  2  for regcheck  0x10   16   10000
n is  2  for regcheck  0x11   17   10001
n is  2  for regcheck  0x12   18   10010
n is  2  for regcheck  0x13   19   10011
n is  2  for regcheck  0x14   20   10100
n is  2  for regcheck  0x15   21   10101
n is  2  for regcheck  0x16   22   10110
n is  2  for regcheck  0x17   23   10111
n is  2  for regcheck  0x18   24   11000
n is  2  for regcheck  0x19   25   11001
n is  2  for regcheck  0x1a   26   11010
n is  2  for regcheck  0x1b   27   11011
n is  2  for regcheck  0x1c   28   11100
n is  2  for regcheck  0x1d   29   11101
n is  2  for regcheck  0x1e   30   11110
n is  2  for regcheck  0x1f   31   11111
n is  2  for regcheck  0x20   32   100000
n is  2  for regcheck  0x21   33   100001
n is  2  for regcheck  0x22   34   100010
n is  2  for regcheck  0x23   35   100011
n is  2  for regcheck  0x24   36   100100
n is  2  for regcheck  0x25   37   100101
n is  2  for regcheck  0x26   38   100110
n is  2  for regcheck  0x27   39   100111
n is  2  for regcheck  0x28   40   101000
n is  2  for regcheck  0x29   41   101001
n is  2  for regcheck  0x2a   42   101010
n is  2  for regcheck  0x2b   43   101011
n is  2  for regcheck  0x2c   44   101100
n is  2  for regcheck  0x2d   45   101101
n is  2  for regcheck  0x2e   46   101110
n is  2  for regcheck  0x2f   47   101111
n is  2  for regcheck  0x30   48   110000
n is  2  for regcheck  0x31   49   110001
n is  2  for regcheck  0x32   50   110010
n is  2  for regcheck  0x33   51   110011
n is  2  for regcheck  0x34   52   110100
n is  2  for regcheck  0x35   53   110101
n is  2  for regcheck  0x36   54   110110
n is  2  for regcheck  0x37   55   110111
n is  2  for regcheck  0x38   56   111000
n is  2  for regcheck  0x39   57   111001
n is  2  for regcheck  0x3a   58   111010
n is  2  for regcheck  0x3b   59   111011
n is  2  for regcheck  0x3c   60   111100
n is  2  for regcheck  0x3d   61   111101
n is  2  for regcheck  0x3e   62   111110
n is  2  for regcheck  0x3f   63   111111
n is  2  for regcheck  0x40   64   1000000
n is  2  for regcheck  0x41   65   1000001
n is  2  for regcheck  0x42   66   1000010
n is  2  for regcheck  0x43   67   1000011
n is  2  for regcheck  0x44   68   1000100
n is  2  for regcheck  0x45   69   1000101
n is  2  for regcheck  0x46   70   1000110
n is  2  for regcheck  0x47   71   1000111
n is  2  for regcheck  0x48   72   1001000
n is  2  for regcheck  0x49   73   1001001
n is  2  for regcheck  0x4a   74   1001010
n is  2  for regcheck  0x4b   75   1001011
n is  2  for regcheck  0x4c   76   1001100
n is  2  for regcheck  0x4d   77   1001101
n is  2  for regcheck  0x4e   78   1001110
n is  2  for regcheck  0x4f   79   1001111
n is  2  for regcheck  0x50   80   1010000
n is  2  for regcheck  0x51   81   1010001
n is  2  for regcheck  0x52   82   1010010
n is  2  for regcheck  0x53   83   1010011
n is  2  for regcheck  0x54   84   1010100
n is  2  for regcheck  0x55   85   1010101
n is  2  for regcheck  0x56   86   1010110
n is  2  for regcheck  0x57   87   1010111
n is  2  for regcheck  0x58   88   1011000
n is  2  for regcheck  0x59   89   1011001
n is  2  for regcheck  0x5a   90   1011010
n is  2  for regcheck  0x5b   91   1011011
n is  2  for regcheck  0x5c   92   1011100
n is  2  for regcheck  0x5d   93   1011101
n is  2  for regcheck  0x5e   94   1011110
n is  2  for regcheck  0x5f   95   1011111
n is  2  for regcheck  0x60   96   1100000
n is  2  for regcheck  0x61   97   1100001
n is  2  for regcheck  0x62   98   1100010
n is  2  for regcheck  0x63   99   1100011
n is  2  for regcheck  0x64   100   1100100
n is  2  for regcheck  0x65   101   1100101
n is  2  for regcheck  0x66   102   1100110
n is  2  for regcheck  0x67   103   1100111
n is  2  for regcheck  0x68   104   1101000
n is  2  for regcheck  0x69   105   1101001
n is  2  for regcheck  0x6a   106   1101010
n is  2  for regcheck  0x6b   107   1101011
n is  2  for regcheck  0x6c   108   1101100
n is  2  for regcheck  0x6d   109   1101101
n is  2  for regcheck  0x6e   110   1101110
n is  2  for regcheck  0x6f   111   1101111
n is  2  for regcheck  0x70   112   1110000
n is  2  for regcheck  0x71   113   1110001
n is  2  for regcheck  0x72   114   1110010
n is  2  for regcheck  0x73   115   1110011
n is  2  for regcheck  0x74   116   1110100
n is  2  for regcheck  0x75   117   1110101
n is  2  for regcheck  0x76   118   1110110
n is  2  for regcheck  0x77   119   1110111
n is  2  for regcheck  0x78   120   1111000
n is  2  for regcheck  0x79   121   1111001
n is  2  for regcheck  0x7a   122   1111010
n is  2  for regcheck  0x7b   123   1111011
n is  2  for regcheck  0x7c   124   1111100
n is  2  for regcheck  0x7d   125   1111101
n is  2  for regcheck  0x7e   126   1111110
n is  2  for regcheck  0x7f   127   1111111
n is  2  for regcheck  0x80   128   10000000
n is  1  for regcheck  0x81   129   10000001 #starts failing
n is  1  for regcheck  0x82   130   10000010
n is  1  for regcheck  0x83   131   10000011
n is  1  for regcheck  0x84   132   10000100
n is  1  for regcheck  0x85   133   10000101
n is  1  for regcheck  0x86   134   10000110
n is  1  for regcheck  0x87   135   10000111
n is  1  for regcheck  0x88   136   10001000
n is  1  for regcheck  0x89   137   10001001
n is  1  for regcheck  0x8a   138   10001010
n is  1  for regcheck  0x8b   139   10001011
n is  1  for regcheck  0x8c   140   10001100
n is  1  for regcheck  0x8d   141   10001101
n is  1  for regcheck  0x8e   142   10001110
n is  1  for regcheck  0x8f   143   10001111
n is  1  for regcheck  0x90   144   10010000
n is  2  for regcheck  0x91   145   10010001 #rare pass for previous send of 0x90 above
n is  1  for regcheck  0x92   146   10010010
n is  1  for regcheck  0x93   147   10010011
n is  1  for regcheck  0x94   148   10010100
n is  1  for regcheck  0x95   149   10010101
n is  1  for regcheck  0x96   150   10010110
n is  1  for regcheck  0x97   151   10010111
n is  1  for regcheck  0x98   152   10011000
n is  1  for regcheck  0x99   153   10011001
n is  1  for regcheck  0x9a   154   10011010
n is  1  for regcheck  0x9b   155   10011011
n is  1  for regcheck  0x9c   156   10011100
n is  1  for regcheck  0x9d   157   10011101
n is  1  for regcheck  0x9e   158   10011110
n is  1  for regcheck  0x9f   159   10011111
n is  1  for regcheck  0xa0   160   10100000
n is  1  for regcheck  0xa1   161   10100001
n is  1  for regcheck  0xa2   162   10100010
n is  1  for regcheck  0xa3   163   10100011
n is  1  for regcheck  0xa4   164   10100100
n is  1  for regcheck  0xa5   165   10100101
n is  1  for regcheck  0xa6   166   10100110
n is  1  for regcheck  0xa7   167   10100111
n is  1  for regcheck  0xa8   168   10101000
n is  1  for regcheck  0xa9   169   10101001
n is  1  for regcheck  0xaa   170   10101010
n is  1  for regcheck  0xab   171   10101011
n is  2  for regcheck  0xac   172   10101100 #rare pass for previous
n is  1  for regcheck  0xad   173   10101101
n is  2  for regcheck  0xae   174   10101110 #rare pass for previous
n is  1  for regcheck  0xaf   175   10101111
n is  1  for regcheck  0xb0   176   10110000
n is  1  for regcheck  0xb1   177   10110001
n is  1  for regcheck  0xb2   178   10110010
n is  1  for regcheck  0xb3   179   10110011
n is  1  for regcheck  0xb4   180   10110100
n is  2  for regcheck  0xb5   181   10110101 #rare pass for previous
n is  1  for regcheck  0xb6   182   10110110
n is  1  for regcheck  0xb7   183   10110111
n is  1  for regcheck  0xb8   184   10111000
n is  1  for regcheck  0xb9   185   10111001
n is  1  for regcheck  0xba   186   10111010
n is  1  for regcheck  0xbb   187   10111011
n is  1  for regcheck  0xbc   188   10111100
n is  1  for regcheck  0xbd   189   10111101
n is  1  for regcheck  0xbe   190   10111110
n is  1  for regcheck  0xbf   191   10111111
n is  1  for regcheck  0xc0   192   11000000
n is  1  for regcheck  0xc1   193   11000001
n is  1  for regcheck  0xc2   194   11000010
n is  1  for regcheck  0xc3   195   11000011
n is  1  for regcheck  0xc4   196   11000100
n is  1  for regcheck  0xc5   197   11000101
n is  2  for regcheck  0xc6   198   11000110 #rare pass for previous
n is  1  for regcheck  0xc7   199   11000111
n is  1  for regcheck  0xc8   200   11001000
n is  1  for regcheck  0xc9   201   11001001
n is  1  for regcheck  0xca   202   11001010
n is  1  for regcheck  0xcb   203   11001011
n is  1  for regcheck  0xcc   204   11001100
n is  1  for regcheck  0xcd   205   11001101
n is  1  for regcheck  0xce   206   11001110
n is  1  for regcheck  0xcf   207   11001111
n is  1  for regcheck  0xd0   208   11010000
n is  1  for regcheck  0xd1   209   11010001
n is  1  for regcheck  0xd2   210   11010010
n is  1  for regcheck  0xd3   211   11010011
n is  1  for regcheck  0xd4   212   11010100
n is  1  for regcheck  0xd5   213   11010101
n is  1  for regcheck  0xd6   214   11010110
n is  1  for regcheck  0xd7   215   11010111
n is  1  for regcheck  0xd8   216   11011000
n is  1  for regcheck  0xd9   217   11011001
n is  1  for regcheck  0xda   218   11011010
n is  1  for regcheck  0xdb   219   11011011
n is  1  for regcheck  0xdc   220   11011100
n is  1  for regcheck  0xdd   221   11011101
n is  1  for regcheck  0xde   222   11011110
n is  1  for regcheck  0xdf   223   11011111
n is  1  for regcheck  0xe0   224   11100000
n is  1  for regcheck  0xe1   225   11100001
n is  1  for regcheck  0xe2   226   11100010
n is  1  for regcheck  0xe3   227   11100011
n is  1  for regcheck  0xe4   228   11100100
n is  1  for regcheck  0xe5   229   11100101
n is  1  for regcheck  0xe6   230   11100110
n is  2  for regcheck  0xe7   231   11100111
n is  1  for regcheck  0xe8   232   11101000
n is  1  for regcheck  0xe9   233   11101001
n is  1  for regcheck  0xea   234   11101010
n is  1  for regcheck  0xeb   235   11101011
n is  1  for regcheck  0xec   236   11101100
n is  1  for regcheck  0xed   237   11101101
n is  1  for regcheck  0xee   238   11101110
n is  1  for regcheck  0xef   239   11101111
n is  1  for regcheck  0xf0   240   11110000
n is  1  for regcheck  0xf1   241   11110001
n is  1  for regcheck  0xf2   242   11110010
n is  1  for regcheck  0xf3   243   11110011
n is  1  for regcheck  0xf4   244   11110100
n is  1  for regcheck  0xf5   245   11110101
n is  1  for regcheck  0xf6   246   11110110
n is  1  for regcheck  0xf7   247   11110111
n is  1  for regcheck  0xf8   248   11111000
n is  1  for regcheck  0xf9   249   11111001
n is  1  for regcheck  0xfa   250   11111010
n is  1  for regcheck  0xfb   251   11111011
n is  1  for regcheck  0xfc   252   11111100
n is  1  for regcheck  0xfd   253   11111101
n is  1  for regcheck  0xfe   254   11111110
n is  1  for regcheck  0xff   255   11111111
n is  1  for regcheck  0x100   256   100000000
n is  2  for regcheck  0x101   257   100000001 # starts working consistently here
n is  2  for regcheck  0x102   258   100000010
n is  2  for regcheck  0x103   259   100000011
n is  2  for regcheck  0x104   260   100000100
n is  2  for regcheck  0x105   261   100000101
n is  2  for regcheck  0x106   262   100000110
n is  2  for regcheck  0x107   263   100000111
n is  2  for regcheck  0x108   264   100001000
n is  2  for regcheck  0x109   265   100001001
n is  2  for regcheck  0x10a   266   100001010
n is  2  for regcheck  0x10b   267   100001011
n is  2  for regcheck  0x10c   268   100001100
n is  2  for regcheck  0x10d   269   100001101
n is  2  for regcheck  0x10e   270   100001110
n is  2  for regcheck  0x10f   271   100001111
n is  2  for regcheck  0x110   272   100010000
n is  2  for regcheck  0x111   273   100010001
n is  2  for regcheck  0x112   274   100010010
n is  2  for regcheck  0x113   275   100010011
n is  2  for regcheck  0x114   276   100010100
n is  2  for regcheck  0x115   277   100010101
n is  2  for regcheck  0x116   278   100010110
n is  2  for regcheck  0x117   279   100010111
n is  2  for regcheck  0x118   280   100011000
n is  2  for regcheck  0x119   281   100011001
n is  2  for regcheck  0x11a   282   100011010
n is  2  for regcheck  0x11b   283   100011011
n is  2  for regcheck  0x11c   284   100011100
n is  2  for regcheck  0x11d   285   100011101
n is  2  for regcheck  0x11e   286   100011110
n is  2  for regcheck  0x11f   287   100011111
n is  2  for regcheck  0x120   288   100100000
n is  2  for regcheck  0x121   289   100100001
n is  2  for regcheck  0x122   290   100100010
n is  2  for regcheck  0x123   291   100100011
n is  2  for regcheck  0x124   292   100100100
n is  2  for regcheck  0x125   293   100100101
n is  2  for regcheck  0x126   294   100100110
n is  2  for regcheck  0x127   295   100100111
n is  2  for regcheck  0x128   296   100101000
n is  2  for regcheck  0x129   297   100101001
n is  2  for regcheck  0x12a   298   100101010
n is  2  for regcheck  0x12b   299   100101011
n is  2  for regcheck  0x12c   300   100101100
n is  2  for regcheck  0x12d   301   100101101
n is  2  for regcheck  0x12e   302   100101110
n is  2  for regcheck  0x12f   303   100101111
n is  2  for regcheck  0x130   304   100110000
n is  2  for regcheck  0x131   305   100110001
n is  2  for regcheck  0x132   306   100110010
n is  2  for regcheck  0x133   307   100110011
n is  2  for regcheck  0x134   308   100110100
n is  2  for regcheck  0x135   309   100110101
n is  2  for regcheck  0x136   310   100110110
n is  2  for regcheck  0x137   311   100110111
n is  2  for regcheck  0x138   312   100111000
n is  2  for regcheck  0x139   313   100111001
n is  2  for regcheck  0x13a   314   100111010
n is  2  for regcheck  0x13b   315   100111011
n is  2  for regcheck  0x13c   316   100111100
n is  2  for regcheck  0x13d   317   100111101
n is  2  for regcheck  0x13e   318   100111110
n is  2  for regcheck  0x13f   319   100111111
n is  2  for regcheck  0x140   320   101000000
n is  2  for regcheck  0x141   321   101000001
n is  2  for regcheck  0x142   322   101000010
n is  2  for regcheck  0x143   323   101000011
n is  2  for regcheck  0x144   324   101000100
n is  2  for regcheck  0x145   325   101000101
n is  2  for regcheck  0x146   326   101000110
n is  2  for regcheck  0x147   327   101000111
n is  2  for regcheck  0x148   328   101001000
n is  2  for regcheck  0x149   329   101001001
n is  2  for regcheck  0x14a   330   101001010
n is  2  for regcheck  0x14b   331   101001011
n is  2  for regcheck  0x14c   332   101001100
n is  2  for regcheck  0x14d   333   101001101
n is  2  for regcheck  0x14e   334   101001110
n is  2  for regcheck  0x14f   335   101001111
n is  2  for regcheck  0x150   336   101010000
n is  2  for regcheck  0x151   337   101010001
n is  2  for regcheck  0x152   338   101010010
n is  2  for regcheck  0x153   339   101010011
n is  2  for regcheck  0x154   340   101010100
n is  2  for regcheck  0x155   341   101010101
n is  2  for regcheck  0x156   342   101010110
n is  2  for regcheck  0x157   343   101010111
n is  2  for regcheck  0x158   344   101011000
n is  2  for regcheck  0x159   345   101011001
n is  2  for regcheck  0x15a   346   101011010
n is  2  for regcheck  0x15b   347   101011011
n is  2  for regcheck  0x15c   348   101011100
n is  2  for regcheck  0x15d   349   101011101
n is  2  for regcheck  0x15e   350   101011110
n is  2  for regcheck  0x15f   351   101011111
n is  2  for regcheck  0x160   352   101100000
n is  2  for regcheck  0x161   353   101100001
n is  2  for regcheck  0x162   354   101100010
n is  2  for regcheck  0x163   355   101100011
n is  2  for regcheck  0x164   356   101100100
n is  2  for regcheck  0x165   357   101100101
n is  2  for regcheck  0x166   358   101100110
n is  2  for regcheck  0x167   359   101100111
n is  2  for regcheck  0x168   360   101101000
n is  2  for regcheck  0x169   361   101101001
n is  2  for regcheck  0x16a   362   101101010
n is  2  for regcheck  0x16b   363   101101011
n is  2  for regcheck  0x16c   364   101101100
n is  2  for regcheck  0x16d   365   101101101
n is  2  for regcheck  0x16e   366   101101110
n is  2  for regcheck  0x16f   367   101101111
n is  2  for regcheck  0x170   368   101110000
n is  2  for regcheck  0x171   369   101110001
n is  2  for regcheck  0x172   370   101110010
n is  2  for regcheck  0x173   371   101110011
n is  2  for regcheck  0x174   372   101110100
n is  2  for regcheck  0x175   373   101110101
n is  2  for regcheck  0x176   374   101110110
n is  2  for regcheck  0x177   375   101110111
n is  2  for regcheck  0x178   376   101111000
n is  2  for regcheck  0x179   377   101111001
n is  2  for regcheck  0x17a   378   101111010
n is  2  for regcheck  0x17b   379   101111011
n is  2  for regcheck  0x17c   380   101111100
n is  2  for regcheck  0x17d   381   101111101
n is  2  for regcheck  0x17e   382   101111110
n is  2  for regcheck  0x17f   383   101111111
n is  2  for regcheck  0x180   384   110000000
n is  1  for regcheck  0x181   385   110000001

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions