i2c не пойму что с шиной
-
-
18.08.2023 #75557
Николай
Ключникbodigard 18 авг 2023, 12:50есть stm32 в качестве мастера, в качестве слейвов MCP23008 и INA226, SDA и SCL притянуты к питанию резисторами на 10 кОм
питание всей этой радости 3.3В
и вот такую картину я вижу когда пытаюсь сформировать START
собственно старт не формируется, бит SB не взлетает
подскажите куда смотреть, у меня уже мыслей нет 🙁BBS 18 авг 2023, 12:57код?bodigard 18 авг 2023, 13:06BBS писал(а):код?да все стандартно
инициализацияstatic void MX_I2C1_Initvoid
{
/* USER CODE BEGIN I2C1_Init 0 */
/* USER CODE END I2C1_Init 0 */
LL_I2C_InitTypeDef I2C_InitStruct = {0},
LL_GPIO_InitTypeDef GPIO_InitStruct = {0},
LL_APB2_GRP1_EnableClockLL_APB2_GRP1_PERIPH_GPIOB,
/**I2C1 GPIO Configuration
PB6 ——>, I2C1_SCL
PB7 ——>, I2C1_SDA
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7,
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE,
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH,
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN,
LL_GPIO_InitGPIOB, &GPIO_InitStruct,
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClockLL_APB1_GRP1_PERIPH_I2C1,
/* USER CODE BEGIN I2C1_Init 1 */
/* USER CODE END I2C1_Init 1 */
/** I2C Initialization
*/
LL_I2C_DisableOwnAddress2I2C1,
LL_I2C_DisableGeneralCallI2C1,
LL_I2C_EnableClockStretchingI2C1,
I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C,
I2C_InitStruct.ClockSpeed = 100000,
I2C_InitStruct.DutyCycle = LL_I2C_DUTYCYCLE_2,
I2C_InitStruct.OwnAddress1 = 0,
I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK,
I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT,
LL_I2C_InitI2C1, &I2C_InitStruct,
LL_I2C_SetOwnAddress2I2C1, 0,
/* USER CODE BEGIN I2C1_Init 2 */
LL_I2C_EnableI2C1,
/* USER CODE END I2C1_Init 2 */
}дефайны
#define I2C_REQUEST_WRITE 0x00
#define I2C_REQUEST_READ 0x01
#define SLAVE_OWN_ADDRESS 0x20обмен
LL_I2C_DisableBitPOSI2C1,
LL_I2C_AcknowledgeNextDataI2C1, LL_I2C_ACK,
LL_I2C_GenerateStartConditionI2C1,
while!LL_I2C_IsActiveFlag_SBI2C1{},
void I2C1->,SR1,
LL_I2C_TransmitData8I2C1, SLAVE_OWN_ADDRESS | I2C_REQUEST_WRITE, //
while!LL_I2C_IsActiveFlag_ADDRI2C1{},
LL_I2C_ClearFlag_ADDRI2C1,
/* send data */
LL_I2C_GenerateStopConditionI2C1,bodigard 18 авг 2023, 13:14единственный момент, у меня нога RESET мс MCP23008 сразу посажена на питание, т.е. я не дергаю её после подачи питанияu37 18 авг 2023, 13:33Ноги CLK-D не перепутали?bodigard 18 авг 2023, 13:39u37 писал(а):Ноги CLK-D не перепутали?если про SDA SCL то нет, на 20 раз уже перепроверил-промерил-прозвонил
tonyk 18 авг 2023, 13:40bodigard писал(а):у меня нога RESET мс MCP23008 сразу посажена на питаниеА вот это зря!
Тискал эту микруху. Схема была собрана на китайских перемычках. Не удивительно, что иногда происходили сбои. Но только этот 23008 наглухо зависал. Процедура сброса узла шины, описанная в мурзилках Филипса, не помогала, помогало только выключение питания, потому что сигнал сброса был подключен к питанию. За PCF8574 такого замечено не было.Cujo 18 авг 2023, 13:47у меня на LL такой код, может поможетI2С_State = I2С_BUSY,
uint32_t end_ms = get_ms + I2C_TIMEOUT,
LL_I2C_HandleTransferI2C2, slaveAddress, LL_I2C_ADDRSLAVE_7BIT, 1, LL_I2C_MODE_SOFTEND, LL_I2C_GENERATE_START_WRITE,
while !LL_I2C_IsActiveFlag_TXISI2C2 {
ifend_ms – get_ms >, I2C_TIMEOUT {
break,
I2С_State = I2C_FAULT_TIMEOUT,
}
}
LL_I2C_TransmitData8I2C2, mem_adr,
while !LL_I2C_IsActiveFlag_TCI2C2 {
ifend_ms – get_ms >, I2C_TIMEOUT {
break,
}
ifLL_I2C_IsActiveFlag_TCRI2C2{
break,
}
}
LL_I2C_HandleTransferI2C2, slaveAddress, LL_I2C_ADDRSLAVE_7BIT, 2, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_START_READ,
while !LL_I2C_IsActiveFlag_RXNEI2C2{
ifend_ms – get_ms >, I2C_TIMEOUT {
break,
}
}
data = LL_I2C_ReceiveData8I2C2 <,<, 8,
while !LL_I2C_IsActiveFlag_RXNEI2C2 {
ifend_ms – get_ms >, I2C_TIMEOUT {
break,
}
}
data |= LL_I2C_ReceiveData8I2C2,
while !LL_I2C_IsActiveFlag_STOPI2C2 {
ifend_ms – get_ms >, I2C_TIMEOUT {
break,
}
}
ifend_ms – get_ms >, I2C_TIMEOUT {
IPS_State = I2C_FAULT_TIMEOUT,
}
else{
IPS_State = I2C_OK,
}bodigard 18 авг 2023, 14:00Cujo писал(а):у меня на LL такой код, может поможету меня f103 там LL немного другой, но смысл вроде тот-же
я понять не могу почему сначала падает SCL а потом SDA, а не наоборотCujo 18 авг 2023, 14:06да, похоже это проблема либо с кодом, либо с пинами (анализатором может)
LL_I2C_GenerateStartCondition(I2C1), – достаточно чтобы SDA в 0 ушло, если I2C включен и не в ошибкеАрсений Вчера, 12:11Только недавно читал про баги I2C в STM32 в этой статье. Может быть поможет.bodigard Вчера, 12:47уже разобрался, в физике дело былоx893 Вчера, 16:24bodigard писал(а):уже разобрался, в физике дело былоСо школы надо было начинать ?
-
Viewing 0 reply threads
- Вы должны войти в систему, чтобы ответить в этой теме.