Skip to content

Commit a01f076

Browse files
author
nofeletru
committed
Установка бита адреса(а0 а1 а2) ни на что не влияет,
если он используется для адресации памяти. Код приведен в удобоваримый вид.
1 parent 0c0a643 commit a01f076

File tree

1 file changed

+111
-52
lines changed

1 file changed

+111
-52
lines changed

software/usbaspi2c.pas

Lines changed: 111 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ interface
3131
procedure EnterProgModeI2C(devHandle: Pusb_dev_handle);
3232
function UsbAspI2C_BUSY(devHandle: Pusb_dev_handle; Address: byte): Boolean;
3333
function 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

3636
implementation
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);
94145
end;
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;
98149
var
99150
value, index: Integer;
100151
begin
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

Comments
 (0)