@@ -31,7 +31,7 @@ interface
3131procedure EnterProgModeI2C (devHandle: Pusb_dev_handle);
3232function UsbAspI2C_BUSY (devHandle: Pusb_dev_handle; Address: byte): Boolean;
3333function UsbAspI2C_Read (devHandle: Pusb_dev_handle; DevAddr, AddrType: byte; Address: longword;var buffer: array of byte; bufflen: integer): integer;
34- function UsbAspI2C_Write (devHandle: Pusb_dev_handle; DevAddr, AddrType: byte; Addr : longword; buffer: array of byte; bufflen: integer): integer;
34+ function UsbAspI2C_Write (devHandle: Pusb_dev_handle; DevAddr, AddrType: byte; Address : longword; buffer: array of byte; bufflen: integer): integer;
3535
3636implementation
3737
@@ -60,120 +60,179 @@ function UsbAspI2C_Read(devHandle: Pusb_dev_handle; DevAddr, AddrType: byte; Add
6060
6161 DevAddr := DevAddr or %10100000 ;
6262
63- // шайтанама
64- // TODO: Только с нулевого адреса автоинкрементом, так как не учитываются все типы адресации
6563 // TODO: 24LC1025
66- // TODO: Привести в читабельный вид
67- // TODO: Сбрасывать биты адресации(a0 a1 a2)
64+
65+
66+ if AddrType = I2C_ADDR_TYPE_7BIT then
67+ begin
68+ value := 0 ;
69+ value := (Byte(Address) shl 1 );
70+ index := 0 ;
71+ end ;
72+
73+ if AddrType = I2C_ADDR_TYPE_1BYTE then
74+ begin
75+ value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
76+ index := Byte(Address);
77+ end ;
78+
79+ if AddrType = I2C_ADDR_TYPE_1BYTE_1BIT then
80+ begin
81+ if IsBitSet(Hi(Word(Address)), 0 ) then
82+ DevAddr := SetBit(DevAddr, 1 )
83+ else
84+ DevAddr := ClearBit(DevAddr, 1 );
85+
86+ value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
87+ index := Byte(Address);
88+ end ;
89+
90+ if AddrType = I2C_ADDR_TYPE_1BYTE_2BIT then
91+ begin
92+ if IsBitSet(Hi(Word(Address)), 0 ) then
93+ DevAddr := SetBit(DevAddr, 1 )
94+ else
95+ DevAddr := ClearBit(DevAddr, 1 );
96+
97+ if IsBitSet(Hi(Word(Address)), 1 ) then
98+ DevAddr := SetBit(DevAddr, 2 )
99+ else
100+ DevAddr := ClearBit(DevAddr, 2 );
101+
102+ value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
103+ index := Byte(Address);
104+ end ;
105+
106+ if AddrType = I2C_ADDR_TYPE_1BYTE_3BIT then
107+ begin
108+ if IsBitSet(Hi(Word(Address)), 0 ) then
109+ DevAddr := SetBit(DevAddr, 1 )
110+ else
111+ DevAddr := ClearBit(DevAddr, 1 );
112+
113+ if IsBitSet(Hi(Word(Address)), 1 ) then
114+ DevAddr := SetBit(DevAddr, 2 )
115+ else
116+ DevAddr := ClearBit(DevAddr, 2 );
117+
118+ if IsBitSet(Hi(Word(Address)), 2 ) then
119+ DevAddr := SetBit(DevAddr, 3 )
120+ else
121+ DevAddr := ClearBit(DevAddr, 3 );
122+
123+ value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
124+ index := Byte(Address);
125+ end ;
68126
69127 if (AddrType = I2C_ADDR_TYPE_2BYTE) then
70128 begin
71129 value := (I2C_2BYTE_ADDR shl 8 ) or (DevAddr);
72130 index := Word(Address);
73- end else
131+ end ;
132+
74133 if (AddrType = I2C_ADDR_TYPE_2BYTE_1BIT) then
75134 begin
76- value := (I2C_2BYTE_ADDR shl 8 ) or (DevAddr);
77-
78- if Hi(Address) and ( 1 shl 0 ) <> 0 then
79- value := value or ( 1 shl 1 );
135+ if IsBitSet(Hi(Address), 0 ) then
136+ DevAddr := SetBit(DevAddr, 1 )
137+ else
138+ DevAddr := ClearBit(DevAddr, 1 );
80139
140+ value := (I2C_2BYTE_ADDR shl 8 ) or (DevAddr);
81141 index := Word(Address);
82- end else
83- if AddrType = I2C_ADDR_TYPE_7BIT then
84- begin
85- value := %00000000 ;
86- index := 0 ;
87- end else
88- begin
89- value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
90- index := 0 ;
91142 end ;
92143
93144 result := USBSendControlMessage(devHandle, USB2PC, USBASP_FUNC_I2C_READ, value , index, bufflen, buffer);
94145end ;
95146
96147// Возвращает сколько байт записали
97- function UsbAspI2C_Write (devHandle: Pusb_dev_handle; DevAddr, AddrType: byte; Addr : longword; buffer: array of byte; bufflen: integer): integer;
148+ function UsbAspI2C_Write (devHandle: Pusb_dev_handle; DevAddr, AddrType: byte; Address : longword; buffer: array of byte; bufflen: integer): integer;
98149var
99150 value , index: Integer;
100151begin
101152 // Low(value) = 2; Адрес устройства
102153 // Hi(value) = 3; Посылать ли первый(lo) или второй(hi) байт
103154 // Lo(index) = 4; Lo адрес
104155 // Hi(index) = 5; Hi адрес
105- // шайтанама
156+
106157 // TODO: 24LC1025
107- // TODO: Привести в читабельный вид
108- // TODO: Сбрасывать биты адресации(a0 a1 a2)
109158
110159 DevAddr := DevAddr or %10100000 ;
111160
112161 if AddrType = I2C_ADDR_TYPE_7BIT then
113162 begin
114- Value := (I2C_0BYTE_ADDR shl 8 ) or (Byte(Addr ) shl 1 ); // 7 бит
163+ Value := (I2C_0BYTE_ADDR shl 8 ) or (Byte(Address ) shl 1 ); // 7 бит
115164 index := 0 ;
116165 end ;
117166
118167 if AddrType = I2C_ADDR_TYPE_1BYTE then
119168 begin
120169 Value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
121- index := Byte(Addr );
170+ index := Byte(Address );
122171 end ;
123172
124173 if AddrType = I2C_ADDR_TYPE_1BYTE_1BIT then
125174 begin
126- Value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
127-
128- if (Hi(Word(Addr)) and ( 1 shl 0 )) <> 0 then
129- value := value or ( 1 shl 1 );
175+ if IsBitSet(Hi(Word(Address)), 0 ) then
176+ DevAddr := SetBit(DevAddr, 1 )
177+ else
178+ DevAddr := ClearBit(DevAddr, 1 );
130179
131- index := Byte(Addr);
180+ value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
181+ index := Byte(Address);
132182 end ;
133183
134184 if AddrType = I2C_ADDR_TYPE_1BYTE_2BIT then
135185 begin
136- Value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
186+ if IsBitSet(Hi(Word(Address)), 0 ) then
187+ DevAddr := SetBit(DevAddr, 1 )
188+ else
189+ DevAddr := ClearBit(DevAddr, 1 );
137190
138- if (Hi(Word(Addr)) and (1 shl 0 )) <> 0 then
139- value := value or (1 shl 1 );
191+ if IsBitSet(Hi(Word(Address)), 1 ) then
192+ DevAddr := SetBit(DevAddr, 2 )
193+ else
194+ DevAddr := ClearBit(DevAddr, 2 );
140195
141- if (Hi(Word(Addr)) and (1 shl 1 )) <> 0 then
142- value := value or (1 shl 2 );
143-
144- index := Byte(Addr);
196+ value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
197+ index := Byte(Address);
145198 end ;
146199
147200 if AddrType = I2C_ADDR_TYPE_1BYTE_3BIT then
148201 begin
149- Value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
202+ if IsBitSet(Hi(Word(Address)), 0 ) then
203+ DevAddr := SetBit(DevAddr, 1 )
204+ else
205+ DevAddr := ClearBit(DevAddr, 1 );
150206
151- if (Hi(Word(Addr)) and (1 shl 0 )) <> 0 then
152- value := value or (1 shl 1 );
207+ if IsBitSet(Hi(Word(Address)), 1 ) then
208+ DevAddr := SetBit(DevAddr, 2 )
209+ else
210+ DevAddr := ClearBit(DevAddr, 2 );
153211
154- if (Hi(Word(Addr)) and (1 shl 1 )) <> 0 then
155- value := value or (1 shl 2 );
212+ if IsBitSet(Hi(Word(Address)), 2 ) then
213+ DevAddr := SetBit(DevAddr, 3 )
214+ else
215+ DevAddr := ClearBit(DevAddr, 3 );
156216
157- if (Hi(Word(Addr)) and (1 shl 2 )) <> 0 then
158- value := value or (1 shl 3 );
159-
160- index := Byte(Addr);
217+ value := (I2C_1BYTE_ADDR shl 8 ) or (DevAddr);
218+ index := Byte(Address);
161219 end ;
162220
163221 if AddrType = I2C_ADDR_TYPE_2BYTE then
164222 begin
165223 value := (I2C_2BYTE_ADDR shl 8 ) or (DevAddr);
166- index := Word(Addr );
224+ index := Word(Address );
167225 end ;
168226
169227 if AddrType = I2C_ADDR_TYPE_2BYTE_1BIT then
170228 begin
171- value := (I2C_2BYTE_ADDR shl 8 ) or (DevAddr);
229+ if IsBitSet(Hi(Address), 0 ) then
230+ DevAddr := SetBit(DevAddr, 1 )
231+ else
232+ DevAddr := ClearBit(DevAddr, 1 );
172233
173- if Hi(Addr) and (1 shl 0 ) <> 0 then
174- value := value or (1 shl 1 );
175-
176- index := Word(Addr);
234+ value := (I2C_2BYTE_ADDR shl 8 ) or (DevAddr);
235+ index := Word(Address);
177236 end ;
178237
179238
0 commit comments