قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

modn3
:: مهندس ::
تاريخ التسجيل: May 2007
المشاركات: 1
نشاط [ modn3 ]
قوة السمعة:0
قديم 27-08-2009, 09:15 AM المشاركة 1   
ha مساعدة في SPI =Serial Periphiral Interface Twitter FaceBook Google+



السلام عليكم ورحمة الله وبركاته
عندي مشكلة في عمل برنامج يعمل interfacing للـ SPI على dspicf33 microcontroller والمشكلة هي انه عندما تعطي قيمو للـ SPI1BUF فانه يبقى دائما صفر مع ان SPITBF يجعلها 1 اي ان هناك قيمة جديدة وضعها في SPI1BUF register
هل من احد يعرف سبب هذه المشكلة، وجزاكم الله خيرا

CODE:
/* SPI Master and Slave functions, .c file*/
#include <p33fxxxx.h>
unsigned char SPIMaster_Init(void)
{
/* Following code snippet shows SPI register configuration for MASTER mode*/
IFS0bits.SPI1IF = 0; //Clear the Interrupt Flag
IEC0bits.SPI1IE = 0; //disable the Interrupt
// SPI1CON1 Register Settings
SPI1CON1bits.DISSCK = 0; //Internal Serial Clock is Enabled.
SPI1CON1bits.DISSDO = 0; //SDOx pin is controlled by the module.
SPI1CON1bits.MODE16 = 0; //Communication is word-wide (8 bits).
SPI1CON1bits.SMP = 0; //Input Data is sampled at the middle of data output time.
SPI1CON1bits.CKE = 0; //Serial output data changes on transition from
//Idle clock state to active clock state
SPI1CON1bits.CKP = 1; //Idle state for clock is a low level;
//active state is a high level

SPI1CON1bits.PPRE=0b00; //configuring the primary prescalar for the clock
SPI1CON1bits.SPRE=0b000; //configuring the secondary prescalar for the clock
SPI1CON1bits.MSTEN = 1; //Master Mode Enabled
SPI1STAT=0x8000;
//SPI1STATbits.SPIEN = 1; //Enable SPI Module
SPI1BUF = 0xFFFF; //Write data to be transmitted
//Interrupt Controller Settings
IFS0bits.SPI1IF = 0; //Clear the Interrupt Flag
IEC0bits.SPI1IE = 1; //Enable the Interrupt
return 0x01;
}


//write interrupt handlers,
unsigned char SPISlave_Init(void)
{
/* Following code snippet shows SPI register configuration for SLAVE Mode*/
SPI2BUF = 0;
IFS2bits.SPI2IF = 0; //Clear the Interrupt Flag
IEC2bits.SPI2IE = 0; //Disable The Interrupt
// SPI1CON1 Register Settings
SPI2CON1bits.DISSCK = 0; //Internal Serial Clock is Enabled
SPI2CON1bits.DISSDO = 0; //SDOx pin is controlled by the module
SPI2CON1bits.MODE16 = 0; //Communication is word-wide (8 bits)
SPI2CON1bits.SMP = 0; //Input Data is sampled at the middle of data
//output time.
SPI2CON1bits.CKE = 0; //Serial output data changes on transition
//from Idle clock state to active clock state
SPI2CON1bits.CKP = 1; //Idle state for clock is a low level; active
SPI2CON1bits.PPRE=0b00; //configuring the primary prescalar for the clock
SPI2CON1bits.SPRE=0b000; //configuring the secondary prescalar for the clock
//state is a high level
SPI2CON1bits.MSTEN = 0; //Master Mode disabled
SPI2STATbits.SPIROV=0; //No Receive Overflow Has Occurred
SPI2STATbits.SPIEN = 1; //En able SPI Module
//Interrupt Controller Settings
IFS2bits.SPI2IF = 0; //Clear the Interrupt Flag
IEC2bits.SPI2IE = 1; //Enable The Interrupt
return 0x01;
}



unsigned char SPIMasterWrite(unsigned char data)
{
//wait until the data(if any in the buffer) is being shifted into the shift register
// while(SPI1STATbits.SPITBF==1)
// {
// ClrWdt()
// }

//when finished shifting, write the data(parameter for function into the buffer)
SPI1STATbits.SPIEN = 1; //Enable SPI Module
//SPI1STATbits.SPIRBF=0;
SPI1BUF=data;
// SPI1TXB=data;
data=SPI1BUF;
// while(SPI1BUF==0);
//wait until the data is being shifted into the shift register
while(SPI1STATbits.SPITBF==1)
{
ClrWdt()
}

//double checking
if(SPI1STATbits.SPITBF==0)
return 0x30; //correct
else
return 0x31; //not correct
}


unsigned char SPISlaveRead(void)
{
return SPI2BUF;
}
void __attribute__((__interrupt__, __no_auto_psv__)) _SPI1Interrupt(void)
{
IFS0bits.SPI1IF = 0; //Clear the Interrupt Flag
//if needed to read something from RXBUF read it here
}

void __attribute__((__interrupt__,__no_auto_psv__)) _SPI2Interrupt(void)
{
IFS2bits.SPI2IF = 0; //Clear the Interrupt Flag
}


اعلانات
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 05:56 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025