Пн май 02, 2016 19:18:05
void Handle_USBAsynchXfer (void)
{
if (needToSend == 1)
{
uint8_t tempData;
tempData = 0x12;
USB_SIL_Write(EP1_IN, &tempData, 1);
SetEPTxValid(ENDP1);
}
}
/*******************************************************************************/
/*******************************************************************************/
void EP1_IN_Callback (void)
{
if (needToSend == 1)
{
uint8_t tempData;
tempData = 0x34;
USB_SIL_Write(EP1_IN, &tempData, 1);
SetEPTxValid(ENDP1);
needToSend = 0;
}
}
/*******************************************************************************/
Ср май 04, 2016 12:31:01
Чт май 05, 2016 10:03:02
Чт май 05, 2016 12:20:39
Чт май 05, 2016 12:55:03
Galizin писал(а):Наверняка это callback функции к каким либо событиям.
void SOF_Callback(void)
{
static uint32_t FrameCount = 0;
if(bDeviceState == CONFIGURED)
{
if (FrameCount++ == VCOMPORT_IN_FRAME_INTERVAL)
{
/* Reset the frame counter */
FrameCount = 0;
/* Check the data to be sent through IN pipe */
Handle_USBAsynchXfer();
}
}
}
BorisSPB писал(а): Так что в Handle_USBAsynchXfer заряжается буфер для первого IN запроса.
Чт май 05, 2016 14:01:01
Согласен, я тоже не нашел легко написанной книги по этому вопросу.isx писал(а):просто разрывает мозг
isx писал(а):какого фига данные, впихнутые через функцию SOF вообще отправляются?
SOF - это начало кадра, и не имеет прямого отношения к устройству.Как я понимаю, то пакет SOF отправляется хостом для того чтоб спросить устройство, хочет ли оно нам что-то передать.
Чт май 05, 2016 14:04:01
Чт май 05, 2016 15:06:52
uint8_t data = '\n';
USB_SIL_Write(EP1_IN, &data, 1);
SetEPTxValid(ENDP1);
USBprintNumber((uint32_t)GyroRawData[0]);
void USBprintNumber(uint32_t x)
{
uint8_t* value;
char i = 0;
do
{
value[i++] = (char) (x%10) + '0';
x /= 10;
} while(x);
USB_SIL_Write(EP1_IN, value, i);
SetEPTxValid(ENDP1);
}
Чт май 05, 2016 16:23:00
Z_h_e писал(а):Согласен, я тоже не нашел легко написанной книги по этому вопросу.
Z_h_e писал(а):SOF - это начало кадра, и не имеет прямого отношения к устройству.
Z_h_e писал(а):Я тоже потихоньку мучаю USB (т.е. он меня), только я не использую готовых библиотек.
Z_h_e писал(а):Если интересно, я в ехселе сделал частичный протокол обменамоего МК по USB/
BorisSPB писал(а):EP1_IN_Callback вызывается в прерывании USB, если есть данные, заряжаем буфер,
FireProoF писал(а):правда на STMF3
Чт май 05, 2016 16:39:14
Чт май 05, 2016 17:06:31
Вроде как допилить осталось чуток. И в божеский вид привести. Но это вроде. Я сначала через первую точку хотел обмен сделать, даже принял данные через winapi функцией READFILE. Но если данных нет, то там зависнешь. HidD_GetInputReport из библиотеки HID.dll отказалась читать, сейчас уже есть предположение почему.isx писал(а):У Вас уже реализован полный обмен данными МК с ПК в обе стороны или пока с дескрипторами разбираетесь?
//Регистры ЮСБ
typedef struct {
volatile uint32_t EP0R;
volatile uint32_t EP1R;
volatile uint32_t EP2R;
volatile uint32_t EP3R;
volatile uint32_t EP4R;
volatile uint32_t EP5R;
volatile uint32_t EP6R;
volatile uint32_t EP7R;
volatile uint8_t reserved[0x20];
volatile uint32_t CNTR;
volatile uint32_t ISTR;
volatile uint32_t FNR;
volatile uint32_t DADDR;
volatile uint32_t BTABLE;
} USB_REGISTR_Type;
#define USB_REGISTR ((USB_REGISTR_Type *) 0x40005C00 ) //базовый адрес регистров ЮСБ
......
//Функция инициализации
void USB_INIT(void){
//очистим массив теста
uint8_t iii;
for ( iii=0;iii<11;iii++){In_Pack[iii]=7;} //тест
//Затактируем модуль ЮСБ
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
USB_REGISTR->CNTR&=~bit1; //сбросим PWDN. Тем самым включим ЮСБ Этот бит включает внутренний voltage references, который питает usb передатчик.
//тут надо сделать паузу tSTARTUP (1мкс надо)
uint32_t temp;
for ( temp=10000000; temp != 0; temp--);
//выключаем сброс ЮСБ
USB_REGISTR->CNTR&=~bit0; //сбросим FRES
//Очистка флагов событий ЮСБ и разрешение прерываний
USB_REGISTR->ISTR=0;
NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
//Настройка ЮСБ вроде маска прерываний но регистр не только для прерываний
USB_REGISTR->CNTR|=
bit15| //CTRM:Correct transfer interrupt mask
//bit14 | //PMAOVRM:Packet memory area over / underrun interrupt mask
//bit13 | //ERRM:Error interrupt mask
//bit12 | //WKUPM:Wakeup interrupt mask
// bit11 | //SUSPM:Suspend mode interrupt mask
bit10 |//разрешение прерывание по резету
//bit9 | //SOFM:Start of frame interrupt mask
//bit8 | //ESOFM:Expected start of frame interrupt mask
0;
}
//*****************************************************************************************
Чт май 05, 2016 21:37:26
USB_SIL_Write(EP1_IN, &tempData, 1);
Пт май 06, 2016 12:52:52
int main(void)
{
/*----------*/
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; //включаем тактирование SYSCFG (хз что это, но так надо :) )
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOEEN; //включаем тактирование портов А и Е
/*----------*/
GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR11 | GPIO_OSPEEDR_OSPEEDR12; // Скорость 50 МГц
GPIOA->MODER |= GPIO_MODER_MODER11_0 | GPIO_MODER_MODER12_0; // Режим альтернативной функции
//GPIOA->OTYPER = 0x00000000;
//GPIOA->PUPDR = GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR12;
GPIOA->AFR[1] |= 0x000EE000; // Номер и пины альтернативной фунции (у нас пина 11 и 12 для альтернативной функции номер 14 - USB)
/*----------*/
GPIOE->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR8 | GPIO_OSPEEDR_OSPEEDR9 | GPIO_OSPEEDR_OSPEEDR10 |
GPIO_OSPEEDR_OSPEEDR11 | GPIO_OSPEEDR_OSPEEDR12 | GPIO_OSPEEDR_OSPEEDR13 |
GPIO_OSPEEDR_OSPEEDR14 | GPIO_OSPEEDR_OSPEEDR15; // Скорость 50 МГц
GPIOE->MODER |= GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1 |
GPIO_MODER_MODER11_1 | GPIO_MODER_MODER12_1 | GPIO_MODER_MODER13_1 |
GPIO_MODER_MODER14_1 | GPIO_MODER_MODER15_1; // Все пины на выход
//GPIOE->OTYPER = 0x00000000;
//GPIOE->PUPDR = 0x00000000;
//GPIOE->AFR[1] |= 0x00000000;
/*----------*/
EXTI->RTSR |= EXTI_RTSR_TR18; // внешнее прерывание №18 (USBWakeUp) по возрастающему фронту
//EXTI->IMR |= EXTI_IMR_MR18; // Включаем прерывание
EXTI->EMR |= EXTI_EMR_MR18; // Включаем событие прерывания USBWakeUp
/*----------*/
NVIC_EnableIRQ(USBWakeUp_IRQn); // Разрешаем прерывание USBWakeUp
//NVIC_SetPriority(USBWakeUp_IRQn, 3); // Приоритет прерывания (не могу определится для USB)
/*----------*/
RCC->CR |= RCC_CR_HSION; //Включить генератор HSI
RCC->CR &= ~RCC_CR_HSEON;
while((RCC->CR & RCC_CR_HSIRDY)==0) {} //Ожидание готовности HSI
RCC->CFGR |= RCC_CFGR_PLLSRC; //Источником сигнала для PLL выбран HSE (внешний - кварц на 8 МГц)
RCC->CR &= ~RCC_CR_PLLON; //Отключить генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMUL; //Очистить PLLMULL
RCC->CFGR |= (RCC_CFGR_PLLMUL_0 | RCC_CFGR_PLLMUL_1 | RCC_CFGR_PLLMUL_2); //Коефициент умножения 9 (будет 72 МГЦ)
RCC->CR |= RCC_CR_PLLON; //Включить генератор PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL
//Переключиться на тактирование от PLL
RCC->CFGR &= ~RCC_CFGR_SW; //Очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_PLL; //Выбрать источником тактового сигнала PLL
while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){} //Ожидание переключения на PLL
/*---------- ----------*/
}
EXTI_InitStructure.EXTI_Line = EXTI_Line18;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
Сб май 07, 2016 12:19:20
int main(void)
{
/*----------*/
/*Тактируем ядро*/
RCC->CR |= RCC_CR_HSION; //Включить генератор HSI
RCC->CR &= ~RCC_CR_HSEON;
while((RCC->CR & RCC_CR_HSIRDY)==0) {} //Ожидание готовности HSI
RCC->CFGR |= RCC_CFGR_PLLSRC; //Источником сигнала для PLL выбран HSE (внешний - кварц на 8 МГц)
RCC->CR &= ~RCC_CR_PLLON; //Отключить генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMUL; //Очистить PLLMULL
RCC->CFGR |= (RCC_CFGR_PLLMUL_0 | RCC_CFGR_PLLMUL_1 | RCC_CFGR_PLLMUL_2); //Коефициент умножения 9 (будет 72 МГЦ)
RCC->CR |= RCC_CR_PLLON; //Включить генератор PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL
//Переключиться на тактирование от PLL
RCC->CFGR &= ~RCC_CFGR_SW; //Очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_PLL; //Выбрать источником тактового сигнала PLL
while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){} //Ожидание переключения на PLL
/*Тактируем периферию*/
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOEEN; // Включаем тактирование портов А и Е
RCC->CFGR |= RCC_CFGR_USBPRE; // Настраиваем частоту USB (= частота ядра / 1.5)
RCC->APB2ENR |= RCC_APB1ENR_USBEN; // Включаем тактирование USB от шины APB1
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // Включаем тактирование SYSCFG (хз что это, но так надо :) )
/*----------*/
/*Настраиваем Порт А*/
GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR11 | GPIO_OSPEEDR_OSPEEDR12; // Скорость 50 МГц
GPIOA->MODER |= GPIO_MODER_MODER11_0 | GPIO_MODER_MODER12_0; // Режим альтернативной функции (для USB)
//GPIOA->OTYPER = 0x00000000;
//GPIOA->PUPDR = GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR12;
GPIOA->AFR[1] |= 0x000EE000; // Номер и пины альтернативной фунции (у нас пины 11 и 12 для альтернативной функции номер 14 - USB)
/*Настраиваем Порт Е*/
GPIOE->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR8 | GPIO_OSPEEDR_OSPEEDR9 | GPIO_OSPEEDR_OSPEEDR10 |
GPIO_OSPEEDR_OSPEEDR11 | GPIO_OSPEEDR_OSPEEDR12 | GPIO_OSPEEDR_OSPEEDR13 |
GPIO_OSPEEDR_OSPEEDR14 | GPIO_OSPEEDR_OSPEEDR15; // Скорость для указанных пинов 50 МГц
GPIOE->MODER |= GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1 |
GPIO_MODER_MODER11_1 | GPIO_MODER_MODER12_1 | GPIO_MODER_MODER13_1 |
GPIO_MODER_MODER14_1 | GPIO_MODER_MODER15_1; // Указанные пины на выход
//GPIOE->OTYPER = 0x00000000;
//GPIOE->PUPDR = 0x00000000;
//GPIOE->AFR[1] |= 0x00000000;
/*----------*/
EXTI->RTSR |= EXTI_RTSR_TR18; // внешнее прерывание №18 (USBWakeUp) по возрастающему фронту
//EXTI->IMR |= EXTI_IMR_MR18; // Включаем прерывание по пинам
EXTI->EMR |= EXTI_EMR_MR18; // Включаем прерывание по событию (USBWakeUp - по обнаружению устройства)
/*----------*/
NVIC_EnableIRQ(USBWakeUp_IRQn); // Разрешаем глобально прерывание USBWakeUp
//NVIC_SetPriority(USBWakeUp_IRQn, 3); // Приоритет прерывания (не могу определится для USB)
}
RCC->CFGR |= RCC_CFGR_USBPRE; // Настраиваем частоту USB (= частота ядра / 1.5)
RCC->APB2ENR |= RCC_APB1ENR_USBEN; // Включаем тактирование USB от шины APB1
Спустя ХХ минут.
NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
// NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn);
NVIC_EnableIRQ(USBWakeUp_IRQn);
// NVIC_SetPriority(USBWakeUp_IRQn, 3);
Вс май 15, 2016 13:08:19
#include "stm32f303xc.h"
#define USB_MAX_PACKET0 ((uint16_t) 0x02)
void Myinit(void)
{
/*Тактируем ядро*/
//RCC->CR |= RCC_CR_HSION; //Включить генератор HSI
//RCC->CR &= ~RCC_CR_HSEON;
RCC->CFGR &= ~RCC_CFGR_SW; //Очистка битов выбора источника тактового сигнала
RCC->CR |= RCC_CR_HSEON;
FLASH->ACR |= FLASH_ACR_LATENCY_1;
FLASH->ACR |= FLASH_ACR_PRFTBE;
while((FLASH->ACR & FLASH_ACR_PRFTBS)==0) {}
while((RCC->CR & RCC_CR_HSERDY)==0) {} //Ожидание готовности HSE
RCC->CFGR |= RCC_CFGR_PLLSRC; //Источником сигнала для PLL выбран HSE (внешний - кварц на 8 МГц)
RCC->CR &= ~RCC_CR_PLLON; //Отключить генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMUL; //Очистить PLLMULL
RCC->CFGR |= RCC_CFGR_PLLMUL_0 | RCC_CFGR_PLLMUL_1 | RCC_CFGR_PLLMUL_2; //Коефициент умножения 9 (будет 72 МГЦ)
RCC->CFGR |= RCC_CFGR_PPRE1_2;
RCC->CR |= RCC_CR_PLLON; //Включить генератор PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL
//Переключиться на тактирование от PLL
//
RCC->CFGR |= RCC_CFGR_SW_1 ; //Выбрать источником тактового сигнала PLL
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} //Ожидание переключения на PLL
/*Тактируем периферию*/
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOEEN; // Включаем тактирование портов А и Е
RCC->CFGR &= ~RCC_CFGR_USBPRE; // Настраиваем частоту USB (= частота ядра / 1.5)
RCC->APB1ENR |= RCC_APB1ENR_USBEN; // Включаем тактирование USB от шины APB1
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // Включаем тактирование SYSCFG (хз что это, но так надо :) )
/*----------*/
/*Настраиваем Порт А*/
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR12; // Скорость 50 МГц
GPIOA->MODER |= GPIO_MODER_MODER11_1 | GPIO_MODER_MODER12_1; // Режим альтернативной функции (для USB)
//GPIOA->OTYPER = 0x00000000;
//GPIOA->PUPDR = GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR12;
GPIOA->AFR[1] |= 0x000EE000; // Номер и пины альтернативной фунции (у нас пины 11 и 12 для альтернативной функции номер 14 - USB)
/*Настраиваем Порт Е*/
GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR10 |
GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR12 | GPIO_OSPEEDER_OSPEEDR13 |
GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR15; // Скорость для указанных пинов 50 МГц
GPIOE->MODER |= GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0 | GPIO_MODER_MODER10_0 |
GPIO_MODER_MODER11_0 | GPIO_MODER_MODER12_0 | GPIO_MODER_MODER13_0 |
GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0; // Указанные пины на выход
//GPIOE->OTYPER = 0x00000000;
//GPIOE->PUPDR = 0x00000000;
//GPIOE->AFR[1] |= 0x00000000;
/*----------*/
EXTI->RTSR |= EXTI_RTSR_TR18; // внешнее прерывание №18 (USBWakeUp) по возрастающему фронту
EXTI->IMR |= EXTI_IMR_MR18; // Включаем прерывание по пинам
//EXTI->EMR |= EXTI_EMR_MR18; // Включаем прерывание по событию (USBWakeUp - по обнаружению устройства)
/*----------*/
NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn);
NVIC_SetPriority(USB_LP_CAN_RX0_IRQn, 8);
NVIC_EnableIRQ(USBWakeUp_IRQn); // Разрешаем глобально прерывание USBWakeUp
//NVIC_SetPriority(USBWakeUp_IRQn, 3); // Приоритет прерывания (не могу определится для USB)
}
// здесь должна быть подтяжка резистора
USB->CNTR &= ~USB_CNTR_PDWN; //подаем питание
USB->CNTR |= USB_CNTR_FRES; //На всякий случай устанавливаем флаг (хотя он итак должен стоять при включении)
USB->CNTR = 0; // в результате FRES сбрасывается в ноль, происходит ресет и генерируется прерывание USB_LP_IRQHandler.
void USB_LP_IRQHandler(void)
{
if(USB->ISTR & USB_ISTR_RESET)
{
USB->ISTR = 0; // сбрасываем флаги
USB->CNTR |= USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM | USB_CNTR_CTRM; // настраиваем маски и включаем прерывание по завершению передачи
........
}
......
}
Вс май 15, 2016 13:32:44
void USB_Reset(void)
{
USB_REGISTR->BTABLE=0;//адрес таблицы дескрипторов таблицы в выделенной памяти
//Настройка буфера EP0
DiscrTable->ADR0TX=0x0040;
DiscrTable->COUNT0TX=0x0000; //макс 0x80
DiscrTable->ADR0RX=0x0100;
DiscrTable->COUNT0RX=0b1011000000000000; //размер буфера 0x80 (128)байт
/*
//Настройка буфера EP1 IN Interupt
DiscrTable->ADR1TX=0x00210;
DiscrTable->COUNT1TX=0x000a; //макс 0x80
DiscrTable->ADR1RX=0x0290;
DiscrTable->COUNT1RX=bit14; //размер буфера 16 байт
*/
/*
//Настройка буфера EP2 OUT Interupt
DiscrTable->ADR1TX=0x0090;
DiscrTable->COUNT1TX=0x0000; //макс 0x40
DiscrTable->ADR1RX=0x0090;
DiscrTable->COUNT1RX=bit14; //размер буфера 16 байт
*/
//Регистры конечных точек 0
USB_REGISTR->EP0R=0x0| //номер точки
bit13|bit12| //STAT_RX - VALID
// bit8 |//какой то статус аут
bit5|//bit4| //STAT_TX - NAK
/*bit10|*/ bit9 ; /*00 BULK //10-9 тип точки. в данном случае Контрол
01 CONTROL
10 ISO
11 INTERRUPT*/
//Регистры конечных точек 1
USB_REGISTR->EP1R=0x1| //номер точки1
bit13|//bit12| //STAT_RX - NAK
bit5 |// bit4| //STAT_TX - NAK (10) Valid (11)
bit10|bit9 ; /*00 BULK //10-9 тип точки. в данном случае Контрол
01 CONTROL
10 ISO
11 INTERRUPT*/
/*
//Регистры конечных точек 2
USB_REGISTR->EP2R=0x2| //номер точки2
bit13|//bit12| //STAT_RX - NAK
bit5|//bit4| //STAT_TX - NAK
bit10|bit9 ; /*00 BULK //10-9 тип точки. в данном случае Контрол
01 CONTROL
10 ISO
11 INTERRUPT
*/
USB_REGISTR->DADDR=bit7;//EF:Enable function, Включение ЮСБ с нулевым адресом
FlagAddress=0; //устройство не пришла команда установки адреса
// FlagZLP=0;
}
Я FRES наоборот сбросил.Вот корявенький перевод REFERENCE, но мне помог.USB->CNTR |= USB_CNTR_FRES; //На всякий случай устанавливаем флаг (хотя он итак должен стоять при включении)
Вс май 15, 2016 15:01:06
Z_h_e писал(а):Я FRES наоборот сбросил
Z_h_e писал(а):Вот корявенький перевод REFERENCE, но мне помог
Z_h_e писал(а)://Настройка буфера EP0
DiscrTable->ADR0TX=0x0040;
DiscrTable->COUNT0TX=0x0000; //макс 0x80
DiscrTable->ADR0RX=0x0100;
DiscrTable->COUNT0RX=0b1011000000000000; //размер буфера 0x80 (128)байт
Вс май 15, 2016 16:12:21
Я их сам определил, т.е. сделал такими какие мне нужны. Есть область памятиisx писал(а):Вот пока главный вопрос - откуда берутся значения этих адресов?
DiscrTable->ADR0RX=0x0100;
//----------
//дескриптор таблицы буферов
typedef struct {
volatile uint32_t ADR0TX;
volatile uint32_t COUNT0TX;
volatile uint32_t ADR0RX;
volatile uint32_t COUNT0RX;
volatile uint32_t ADR1TX;
volatile uint32_t COUNT1TX;
volatile uint32_t ADR1RX;
volatile uint32_t COUNT1RX;
volatile uint32_t ADR2TX;
volatile uint32_t COUNT2TX;
volatile uint32_t ADR2RX;
volatile uint32_t COUNT2RX;
} DiscrTable_Type;
#define DiscrTable ((DiscrTable_Type *) 0x40006000)
Пт май 20, 2016 20:56:03
Z_h_e писал(а):Я их сам определил, т.е. сделал такими какие мне нужны. Есть область памяти
0x4000 6000- 0x4000 63FF. Именно с ней работает USB.
Z_h_e писал(а): Адрес таблицы указывается в регистре USB_REGISTR->BTABLE=0. Такая запись указывает что таблица находится по адресу 0x4000 6000+0*2.
Z_h_e писал(а):Это еще что, поглядите как устанавливаются биты регистров конечной точки USB_EPnR.
USB->CNTR |= USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM;
Сб май 21, 2016 07:55:55
Очень даже можно. Только надо помнить, что там же таблица адресов.isx писал(а):Пока я не могу понять, почему нельзя просто сделать эти адреса друг за другом
Ну можно ж ее в конце памяти разместить, а буфера тогда можно с самого начала или несколько таблиц иметь и переключать их.isx писал(а):И зачем здесь вообще указывать что-то другое, если можно поставить ноль, и плясать от него?
Предствате что у Вас биты STAT_TX[1:0] устновлены в 10 (NACK). А Вам надо установить в состояние 11 (VALID) . Тогда такая конструкция EP|= STAT_TX1 | STAT_TX0 не прокатит.isx писал(а):Глядел. Пока все прозрачно вроде, но уверен,...
Дык маски ж прерываний. Но я включил только CTRM и RESETM. Мне хватило этого.isx писал(а):Что за "маски" тут настраиваются?
Прошел по USB пакет SOF. Тут же в регистре USB_ISTR устанавливается флаг SOF (он так и будет висеть пока не сбросите), но так как у меня маска SOFM не установлена, то прерывание не возникнет.Если нет, то что будет если включить прерывание, а маску нет?
//обработчик прерывания низкого уровня ЮСБ
void USB_LP_CAN1_RX0_IRQHandler(void)
{
// SUSPM:Suspend mode interrupt mask
// if (USB_REGISTR->ISTR&bit11){
// USB_REGISTR->ISTR&=~bit11;// сброс флага события
// USB_REGISTR->CNTR|=bit1; //установим PWDN. Тем самым вsключим ЮСБ
// return; //выходим из обработчика прерываний
// }
//прерывание изза резета SE0
if (USB_REGISTR->ISTR & bit10){
USB_REGISTR->ISTR &=~bit10;// сброс флага события резет
USB_Reset(); //делаем то что нужно после резета
return; //выходим из обработчика прерываний
}
//CTRM:Correct transfer interrupt mask
//Конечно точка что то удачно сделала.
//информация об это в битах DIR и EP_ID[3:0]
if (USB_REGISTR->ISTR & bit15){
//USB_REGISTR->ISTR&=~bit15;// сброс флага события этот флаг только для чтения
Correct_Transfer();
return; //выходим из обработчика прерываний
}
//Ошбика если контроллер вовремя не ответил или ...
// if (USB_REGISTR->ISTR & bit14){
// USB_REGISTR->ISTR&=~bit14;// сброс флага события
// return; //выходим из обработчика прерываний
// }
////ERRM:Error interrupt mask
//ошибка CRC и прочей хрени. вобщем то можно на нее не реагировать. Нужно для отладки
//if (USB_REGISTR->ISTR&bit13){
// USB_REGISTR->ISTR&=~bit13;// сброс флага события
// return; //выходим из обработчика прерываний
// }
//Wakeup interrupt mask
// if (pUSB_REGISTR->USB_ISTR&bit12){
// pUSB_REGISTR->USB_ISTR&=~bit12;// сброс флага события
// return; //выходим из обработчика прерываний
// }
//SOFM:Start of frame interrupt mask
//if (pUSB_REGISTR->USB_ISTR&bit9){
// pUSB_REGISTR->USB_ISTR&=~bit9;// сброс флага события
// return; //выходим из обработчика прерываний
// }
//ESOFM:Expected start of frame interrupt mask
// if (pUSB_REGISTR->USB_ISTR&bit8){
// pUSB_REGISTR->USB_ISTR&=~bit8;// сброс флага события
// return; //выходим из обработчика прерываний
// }
}