Цитата(Сергей Борщ @ Dec 27 2013, 02:33)

Заметил такую особенность: вы в Soft_I2C_send() делаете проверку на отпускание SCL (while (CHECK_SCL==0); ), а в SOFT_I2C_STOP() - нет. Возможно подчиненное устройство подтормаживает и из-за этого на шине не получается стоп-условие. Также такая проверка отсутствует в Soft_I2C_read() в части чтения ack и в read_ack().
И еще: посмотрите листинг функции delay_i2c() - не заменил ли ее компилятор на один единственный BX LR. конечно там есть __IO в объявлении параметра и наверняка этот макрос содержит в себе ключевое слово volatile, но все же проверьте.
Добавил проверку в SOFT_I2C_STOP() и в read_ack и в Soft_I2C_read(), не помогло.....
delay занимает примерно 11 команд :
CODE
delay_i2c:
08003238: sub sp, #8
0800323a: str r0, [sp, #4]
0800323c: ldr r3, [sp, #4]
0800323e: cbz r3, 0x800324e <delay_i2c+22>
08003240: ldr r3, [sp, #4]
08003242: add.w r3, r3, #4294967295
08003246: str r3, [sp, #4]
08003248: ldr r3, [sp, #4]
0800324a: cmp r3, #0
0800324c: bne.n 0x8003240 <delay_i2c+8>
0800324e: add sp, #8
08003250: bx lr
08003252: nop
Засада все-таки в том что если поставить брекпоинт на temp = READ_ADDR(Current_DAC); считывается все нормально( вижу 0x32 осциллографом), если вообще убрать эту проверку, все работает- получил 3-фазное напряжение на выходе с возможностью изменения сдвига фаз . И операция нужна 1 раз, собственно для прописывания адреса во 2 DAC однократно, на этапе первоначального старта свежеиспеченой платки.
переписал delay_i2c: void delay_i2c(__IO uint32_t delay) { while (delay--);}
занимает 7 команд:
CODE
452 void delay_i2c(__IO uint32_t delay) { while (delay--);}
0800323c: ldr r3, [sp, #4]
0800323e: add.w r2, r3, #4294967295
08003242: str r2, [sp, #4]
08003244: cmp r3, #0
08003246: bne.n 0x800323c <delay_i2c+4>
08003248: add sp, #8
0800324a: bx lr
подправил тайминги, не помогло... даже посылал после Soft_I2C_read 9 импульсов вдогонку для освобождения шины, те же
Сообщение отредактировал belial - Dec 27 2013, 00:31