Datenuebertragung-STM32F4
Datenübertragung über 4 Datenleitungen
Zwei STM32F4 Discovery Boards sollen durch 4 parallele Datenleitungen und eine Steuerleitung, ähnlich der LCD-Implementierung, miteinander kommunizieren. An einem Board werden über eine PS/2 Tastatur Zeichen eingegeben. Von diesem Board werden die Zeichen an das zweite Board übertragen. Das zweite Board sendet diese Zeichen über die USART-Schnittstelle an ein PC-Terminal Programm (Putty oder Teraterm).
Blockschaltbild
Beschreibung des Projekts als Fließtext und/oder Liste von Features.
PIN-Belegung
Übertragung
Die Übertragung erfolgt parallel über 4 Datenleitungen. Eine Control Leitung „C“ teilt den Empfänger (RCV) mit wann die vom Sender (XMT) angelegten Daten gültig sind (positive Flanke des Control Signales). Da ein Character aus 8 Bit besteht, jedoch nur 4 Datenleitungen für die parallele Übertragung verfügbar sind, muss ein Character in Nibbles zu 4 Bit unterteilt werden. Auf der Empfangsseite werden die 2 empfangenen Nibbles wieder zu einem Character mit 8 Bit zusammengesetzt.
Code
Site A
/**
* @brief Main-Funktion
* @param None
* @retval None
*/
int main(void){
/* Stromversorgung / mit Takt versorgen */
RCC_initialisieren();
/* Pins konfigurieren */
GPIO_initialisieren();
/* Interrupt fuer PS2-Clock */
EXTILine15_10_Config();
/* Auf interrupt warten */
while(1){} }
RCC Config
/**
- @brief Stromversorgung und Takt für SYSCFG und GPIO aktivieren
* @param None
* @retval None
*/
void RCC_initialisieren(void){
/* Für EXTI - GPIO */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
// EXTI mit Takt versorgen
/* Für XMT */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
// GPIOC mit Takt versorgen
/* Für PS2 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
// GPIOE mit Takt versorgen
}
GPIO Config
/**
* @brief GPIO Pins konfigurieren
* Transmit:GPIOC (Pin 0-3 Daten,Pin 15 Steuerleitung)
* PS2: GPIOE (Pin 9 -> Daten | Pin 11 -> Clock)
* @param None
* @retval None
*/
void GPIO_initialisieren(void){
/* Senddata (Daten) */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
// Ports als Output definieren
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; // Pins 0,1,2,3 aktivieren
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Output Modus: Push-pull
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // Abtastfrequenz auf 2MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);
// GPIOC Konfiguration übergeben, Pointer auf Struktur mit Config
/* Steuerleitung */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // Port als Output definieren
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // Pin 15 aktivieren
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Output Modus: Push-pull
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // Abtastfrequenz auf 2MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);
// GPIOC Konfiguration übergeben, Pointer auf Struktur mit Config
/* PS2 -> (Pin 9 -> Daten | Pin 11 -> Clock) */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // Port als Input definieren
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // Input Modus: Pull-Up
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11;
// Pin9 und Pin11 aktivieren
GPIO_Init(GPIOE, &GPIO_InitStructure);
// GPIOE Konfiguration übergeben, Pointer auf Struktur mit Config
}
EXTI-Config
/**
* @brief EXTI auf PE11 konfigurieren
* @param None
* @retval None
*/
void EXTILine15_10_Config(void) {
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource11);
// Verbinde EXTILine15_10 mit PE11
EXTI_InitStructure.EXTI_Line = EXTI_Line11; // EXTI_Line 11
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // Auf Interrupt-Mode
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
// fallende Flanke (-> low) = Daten sind gueltig
// EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // EXTI aktivieren EXTI_Init(&EXTI_InitStructure);
// EXTI Konfiguration übergeben , Pointer auf Struktur mit Config
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
// NVIC-Kanal 15_10 für EXTI_Line 11
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; // PreemtionPrio = 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; // SubPrio = 1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC-Kanal aktivieren
NVIC_Init(&NVIC_InitStructure);
// NVIC Konfiguration übergeben , Pointer auf Struktur mit Config
}
Interrupt-Routine
/**
- @brief Interrupt Handler für Pin11 (Clock von der Tastatur) * @param None
- @retval None
- /
void EXTI15_10_IRQHandler(void) {
if(EXTI_GetITStatus(EXTI_Line11) != RESET) // überprüfen ob Pending Bit gesetzt ist
{
ps2_data(); // Aufruf der Funktin in "functions.c"
EXTI_ClearITPendingBit(EXTI_Line11); // Pendingbit löschen
}
}
Download
Receive Programm(Keil Projekt): Datei:RCV v18.zip
Transmit Programm(Keil Projekt): Datei:XMT v21.zip