В общем довел до ума мышку. Три недели все это продолжалось. Сам запутался на несколько рядов так что сложно сказать что было не так. В итоге сделал захват и подсчет импульсов с помощью таймера TIM4 на ножке PB6 (clock ps/2). Так как у меня почему то постоянно сбивалась переменная которая отвечает за подсчет входных фронтов на выводе clock (или битов проще). Пробовал делать ее volatile но не было результата. Ногу data выбрал PB7 так было удобно но в принципе data может быть на любом свободном выводе.
Несколько замечаний по поводу того что обсуждалось выше.
-Мышь работает при 3 вольтовом питании ([хотя для контроллера в мыши PAW3401 написано 4.5-5.5 вольт)
-Мыши не нужно посылать подтверждение от хоста как я писал выше( было на осциллограмме от ПК.)
-В файле PS2_Mouse.c есть функция PS2_Mouse_GetData() ее я честно скопировал у автора и не переделывал почти.Она нормально преобразует данные из входных буферов в перемещение по х и по у и нажатие кнопок. Одно не мог понять в данной функции почему нет обработки флагов переполнения для х и у. Но в итоге я себе не так представлял работу мыши. Мышь отправляет величину перемещения не абсолютные значения а только изменение по х и у между посылками сэмплов. Потому что после каждой посылки счетчики перемещения сбрасываются в 0. В общем флаги переполнения просто не учитываются. При стандартных настройках 100 сэмплов с секунду и при разрешении в 4 мм на отсчет чтобы произошло переполнение нужно катнуть мыщь на 256/4=64 мм за 10 милисекунд. Или 6 метров в секунду. Думаю для рабочего стола где обитает мышь при стандартных настройках можно не учитывать переполнение. Хотя можно и на такое наверное извратиться. Может я и не прав но все работает и без этого.
-В функции PS2_Mouse_Tx(uint8_t cmd) после задержки для линии clock нужно обнулять таймер. TIM->CNT=0. По ходу это какой то 'костыль' но без этого не работает. Сам теоретически не могу сказать почему. Только экспериментальным путем вычислил. Иначе при старте первый байт отправляется правильно а вот следующие нет. Так как таймер после посылки остается в значении 1 и для последующей его нужно обнулять.
Прикрепляю файлы. Сам использовал мышь с теми настройками которые сохранены в PS2_Mouse_Start() и не закомментированы. Работа с мышью в таком порядке Сначала PS2_Mouse_Init(); затем PS2_Mouse_Start(); После этого в прерывании от таймера 100 раз в секунду запускаю функцию PS2_Mouse_GetData(); для обновления координат указателя мыши.
Прерывание от таймера который захватывает такты мыши. Мышь отправляет сэмплы 60 раз в секунду. Приемлемо для экрана 480 на 272.
Код
void TIM4_IRQHandler(void){
//if(PS2_MOUSE.status==MOUSE_AKTIV)
if(TIM4->SR&TIM_SR_UIF)
{
TIM4->SR&=~TIM_SR_TIF;
if(PS2_MOUSE_VAR.mode==RX_MODE)
PS2_Mouse_CheckScancode(scancode);
else if (PS2_MOUSE_VAR.mode==TX_MODE)
PS2_MOUSE_VAR.mode=RX_MODE;
TIM4->SR&=~TIM_SR_UIF;
}
else if(TIM4->SR&TIM_SR_TIF)
{
PS2_Mouse_ISR();
TIM4->SR&=~TIM_SR_TIF;
}
}
Прерывание от таймера который вызывает GetData и заносит данные в GUI 100 раз в секунду.
Код
void TIM6_DAC_IRQHandler(void)
{
/* USER CODE BEGIN TIM6_DAC_IRQn 0 */
uint32_t temp;
if(Input_Device==INPUT_DEV_MOUSE)
{
if(PS2_MOUSE.status==MOUSE_NEW_DATA)
{
PS2_Mouse_GetData();
PS2_MOUSE.status=MOUSE_AKTIV;
State.x=PS2_MOUSE.xPos;
State.y=272-PS2_MOUSE.yPos;
State.Pressed=PS2_MOUSE.LButton;
}
else
{
GUI_MOUSE_GetState(&State);
if(State.Pressed==1)
{
State.Pressed=0;
GUI_MOUSE_StoreState(&State);//GUI_TOUCH_StoreStateEx(&State);
}
}
}
TIM6->SR&=~TIM_SR_UIF; //Сбрасываем флаг UIF
}
Драйвер написан на CMSIS. Сам проекту меня на HAL но долго не мог запустить и в итоге упрощал все где можно чтоб заработало получилось CMSIS. Старался комменты расставлять. Если что не понятно спрашивайте! Отвечу!