저는 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);
}
고마워요. 다시 읽었고, 찾으면 나에게 기다리고 있습니다. – Mahtab
나는 이상한 해결책이 있습니다. 그것은 이론적으로 작동해야하지만, 나는 그것을 테스트 할 수 없습니다. 먼저 하드웨어. UART 수신기를 사용할 수있는 최대 주파수를 계산해야합니다. 1MBit/s 정도 여야합니다. 둘째는이 주파수에 타이머를 설정하고 센서 클럭 신호를 확인하고 또한 MCU 의 SPI의 CLK에 연결해야 예, SPI MISO 핀이 시리얼 입력 – picoworm
센서에 연결되어야 동기화 데이터를 전송하는 SPI를 사용해야 SPI 슬레이브로 구성되어야하며 16 비트 데이터 프레임을 가져야합니다. IDLE USART 출력을 만들기 위해서는 SPI 레지스터를 0xffff로 설정해야합니다. 데이터를 보내야하는 경우 데이터보다 1 시작 비트를 작성해야합니다. 그런 다음 비트를 중지하십시오. SPI 데이터 레지스터의 10 비트를 취해야하며 6 비트는 1로 설정됩니다. – picoworm