2014-07-20 8 views
3

저는 TSL2301이라는 라인 스캔 CCD 센서에서 작업하고 있습니다. stm32f103의 USART로 픽셀을 읽으려고하지만 항상 0xFF를 수신 할 수 있습니다. 아무도이 센서로 작업하지 않았습니까? 나를? Usart 동기 모드 STM32f10x를 사용했는데, Usart가 센서에 몇 가지 주문을 보내고 각 주문 후 8 클럭 지연을 만들고 싶습니다. 내가 어떻게 해?TSL2301을 사용하고 usart에서 클록 지연을 만드는 방법

int count=0; 
int i=0; 
uint8_t data[102]={0}; 
USART_ClockInitStructure.USART_Clock = USART_Clock_Enable; 
USART_ClockInitStructure.USART_CPOL = USART_CPOL_High; 
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; 
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Enable; 
USART_ClockInit(USARTy, &USART_ClockInitStructure); 

USART_InitStructure.USART_BaudRate = 2200000; 
USART_InitStructure.USART_WordLength = USART_WordLength_8b; 
USART_InitStructure.USART_StopBits = USART_StopBits_1; 
USART_InitStructure.USART_Parity = USART_Parity_No ; 
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 
USART_Init(USARTy, &USART_InitStructure); 

/* Configure the USARTy */ 
USART_Init(USARTy, &USART_InitStructure); 

/* Enable the USARTy */ 
USART_Cmd(USARTy, ENABLE); 

while(1) 
{ 
while(count < 3)  
{            
USART_SendData(USARTy,0xFF); 
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET); 
count++; 
} 
count=0; 
USART_SendData(USARTy,0x1b);  //RESET command 
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET); 

USART_SendData(USARTy,0x1b); 
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET); 

USART_SendData(USARTy,0x1b); 
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET); 

USART_SendData(USARTy,0x08); //StartInt Command 
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET); 

while(count < 20)//DelayIntegrationTime() ; 
{ 
USART_SendData(USARTy,0xFF); 
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET); 
count++; 
} 
count = 0; 
USART_SendData(USARTy,0x10); //SampleInt Command 
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET); 

USART_SendData(USARTy,0x02);  //ReadPixel Command 
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET); 

while(count < 2) 
{ 
USART_SendData(USARTy,0xFF); 
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET); 
count++; 
} 
count = 0; 

USART_Cmd(USARTy, DISABLE); 
USART_ClockInitStructure.USART_CPOL = USART_CPOL_High; 
USART_ClockInitStructure.USART_CPHA = USART_CPHA_1Edge; 
USART_ClockInit(USARTy, &USART_ClockInitStructure); 
USART_Init(USARTy, &USART_InitStructure); 
USART_Cmd(USARTy, ENABLE); 

/*read pixels*/ 
for (i = 0; i < 102; i++) 
{ 
    while(USART_GetFlagStatus(USARTy, USART_FLAG_RXNE) == RESET); 
    data[i] = USART_ReceiveData(USARTy); 
    while(count < 1) 
    { 
    USART_SendData(USARTy,0xFF); 
    while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET); 
    count++; 
    } 
    count = 0; 
} 

USART_Cmd(USARTy, DISABLE); 
USART_ClockInitStructure.USART_CPOL = USART_CPOL_High; 
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; 
USART_ClockInit(USARTy, &USART_ClockInitStructure); 
USART_Init(USARTy, &USART_InitStructure); 
USART_Cmd(USARTy, ENABLE); 

}

답변

0

STM32F103 참조 설명서 및 TAOS 데이터 시트에서 다른 USART 타이밍도있다. 그들은 USART 모드에서 함께 작동하지 않을 것이라고 생각합니다.

아이디어로 USART 대신 UART를 사용해 볼 수 있습니다. 그리고 MCO 또는 다른 클럭 소스를 사용하여 디바이스를 클럭하십시오. 나는 그것이 효과가 있어야한다고 생각한다.

이 경우 타이머로 수행 할 수있는 모든 지연이 있습니다.

추신 :하지만 해결해야 할 또 하나의 문제는 UART의 출력을 클록 소스와 동기화하는 것입니다. stm32 설명서를 더 자세히 읽고 어떻게해야하는지 알려줄 필요가 있습니다. 나중에 다시 할게요

+0

고마워요. 다시 읽었고, 찾으면 나에게 기다리고 있습니다. – Mahtab

+0

나는 이상한 해결책이 있습니다. 그것은 이론적으로 작동해야하지만, 나는 그것을 테스트 할 수 없습니다. 먼저 하드웨어. UART 수신기를 사용할 수있는 최대 주파수를 계산해야합니다. 1MBit/s 정도 여야합니다. 둘째는이 주파수에 타이머를 설정하고 센서 클럭 신호를 확인하고 또한 MCU 의 SPI의 CLK에 연결해야 예, SPI MISO 핀이 시리얼 입력 – picoworm

+0

센서에 연결되어야 동기화 데이터를 전송하는 SPI를 사용해야 SPI 슬레이브로 구성되어야하며 16 비트 데이터 프레임을 가져야합니다. IDLE USART 출력을 만들기 위해서는 SPI 레지스터를 0xffff로 설정해야합니다. 데이터를 보내야하는 경우 데이터보다 1 시작 비트를 작성해야합니다. 그런 다음 비트를 중지하십시오. SPI 데이터 레지스터의 10 비트를 취해야하며 6 비트는 1로 설정됩니다. – picoworm