2010-03-31 4 views
3

을 설정하지만 매번 같은 것하지 비트 내가 말할 :STM32 I2C1 시작이 SR1 레지스터 내 I2C EEPROM을 이야기하는 STM32를 프로그램하려고

I2C_GenerateSTART(I2C1, ENABLE); 
while(!(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))); the code hangs here 

내가 디버거를 통해 가서 내가 발견 SR1 비트 0 플래그 (시작 비트 생성 플래그)가 설정되지 않아 코드가 정지되는 것입니다. 오실로스코프에서 시작 비트가 생성되었고 이것이 때로는 작동한다는 것을 알 수 있습니다. 그것은 연속적으로 여러 글을 쓰려고 할 때 보통 부서집니다. 나는 HW가 모든 것이 괜찮은지 확인했다. 내가 i2c 버스에서 실행중인 주파수를 확인했다. 24lc1025 eeprom 내에 100Khz이다.

아이디어,

감사

답변

6

이 일반적으로 당신이 행에 여러 쓰기를 수행 할 때 나누기 말 때문에, 당신이 STM32이 메모를 위반하지 않을 것을 보장 할 수 있습니다

참고 : 다음 I2C_CR1 제어 레지스터의 STOP 비트 데이터 시트 STOP, START 또는 PEC 비트가 설정되어, 소프트웨어는 어떤 쓰기 수행해서는 안 이 비트가 하드웨어에 의해 클리어되기 전에 I2C_CR1에 액세스하십시오. 그렇지 않은 경우 두 번째로 STOP, START 또는 PEC 요청을 설정할 위험이 있습니다.

가되면 당신은 당신이 다음 START 비트를 기록하기 전에 하드웨어를 취소했다 있는지 확인하는 데 필요한 STOP 비트를 설정합니다.

+0

감사합니다. 저는 월요일에이 점을 점검 할 것입니다. 왜냐하면 이것이 STOP 비트가 지워져서 이것이 모든 문제의 근원이 될 수 있는지를 확인하지 않는다는 것을 확실히 압니다. 나는 데이터 시트에서 내가 어떻게 그것을 놓쳤는 지 모른다. – jramirez

+0

상태 레지스터에 없기 때문에 그다지 명백하지 않습니다. 그러나 다시 한번, 하드웨어 레지스터에는 거의 확실하지 않은 것들이 거의 있습니다. 이것이 드라이버가 어려운 이유입니다. –

+0

빠른 업데이트 나는 당신이 말한 것을 시도하고 시작 비트에 대한 문제를 수정했다. 이제 장치가 응답하지 않는 슬레이브 주소를 보낸 후에 다른 것이 있습니다. 이 때 하나의 행운을 시도 할 때 연속으로 두 개의 쓰기를 시도 할 때 작동합니다. 나는 범위를 확인하고 신호가 잘 보입니다. EEprom은 주소가 전송 된 후 응답하지 않습니다. 나는 쓰기 사이에 주소가 변경되지 않았는지 확인했다. 그리고 쓰기 사이에 5ms의 지연을 넣으면 연속 쓰기로 작동한다. 나는 100khz 버스에서이 EEPROM을 실행 중이다. 24lc1025는 1Mhz까지 어떤 아이디어도 낼 수있다. – jramirez

1

장치에 대한 정오표를 확인하십시오 (ST 웹 사이트에서 확인하십시오). STM32에는 I2C 구현에 많은 버그가 있습니다. 에라타는 소프트웨어 대안을 제공합니다.

0

또한 일반적으로 STM32 플랫폼과 함께 제공되는 드라이버 소스 파일을 사용할 때 헤더를 읽는 것을 잊지 마십시오! 그들은 특히 어디에서 시작 해야할지 모르는 초보자 (나 같은)에게 매우 도움이 될 수 있습니다.

이 경우보실 수 있습니다. stm32f4xx_i2c.c