Arkadaşlar merhaba, bir projemden dolayı 32bit pic kullanmak durumunda kaldım ve derleyici olarak da mplab x ide harmony kullanıyorum. Daha önceden mplab harmony kullanan var mı acaba? i2c haberleşmesinde debug yaparken PLIB_I2C_ReceivedByteGet(...) fonksiyonunda takılıp kalıyor. harmony ile i2c kullanan var ise yardımcı olursa çok sevinirim.
Harmony falan fark etmiyor bu I2C nerede olursa olsun takılıyor !!!
Durum registerlerını kontrol et(debug) mutlaka biri SET/RESET olmuyordur.
Alıntı yapılan: baran123 - 12 Eylül 2017, 21:33:05
Harmony falan fark etmiyor bu I2C nerede olursa olsun takılıyor !!!
Durum registerlerını kontrol et(debug) mutlaka biri SET/RESET olmuyordur.
maalesef ne var ne yoksa kontrol ettim, farklı 3-5 kod yazdım ama nafile. harmony nasıl çalışıyor hala kavrayamadım. bazı örneklerde ack-nack gönderilip alınmıyor bazı örneklerde start + address + w + register işleminden sonra stop gönderilmemiş direk start + address + r işlemleri yapılıp veri okunmuş. kafam 1 milyon oldu.
kullandığım sensör smb380
#define slave_ADDR 0x38
#define slave_WRITE_ADDR 0x70
#define slave_READ_ADDR 0x71
#define accx1_DATA_ADDR 0x02
APP_DATA appData;
uint8_t count;
uint8_t length = 6;
uint8_t buffer[6];
uint16_t x,y,z;
void APP_Initialize ( void )
{
appData.state = APP_STATE_INIT;
}
void APP_Tasks ( void )
{
PLIB_I2C_Enable(I2C_ID_2);
PLIB_I2C_MasterStart(I2C_ID_2);
PLIB_I2C_TransmitterByteSend(I2C_ID_2 , slave_WRITE_ADDR);
while(!PLIB_I2C_MasterReceiverReadyToAcknowledge(I2C_ID_2));
PLIB_I2C_TransmitterByteSend(I2C_ID_2 , accx1_DATA_ADDR);
while(!PLIB_I2C_MasterReceiverReadyToAcknowledge(I2C_ID_2));
PLIB_I2C_MasterStop(I2C_ID_2);
PLIB_I2C_MasterStartRepeat(I2C_ID_2);
PLIB_I2C_TransmitterByteSend(I2C_ID_2 , slave_READ_ADDR);
// while(!PLIB_I2C_MasterReceiverReadyToAcknowledge(I2C_ID_2));
for(count= 0 ; count < length ; count ++)
{
buffer[count] = PLIB_I2C_ReceivedByteGet(I2C_ID_2);
if(count == length -1)
{
PLIB_I2C_ReceivedByteAcknowledge(I2C_ID_2 , false);
}
else
{
PLIB_I2C_ReceivedByteAcknowledge(I2C_ID_2 , true);
}
}
PLIB_I2C_MasterStop(I2C_ID_2);
x = ((((int16_t)buffer[1]) << 8) | buffer[0]) >> 6;
y = ((((int16_t)buffer[3]) << 8) | buffer[2]) >> 6;
z = ((((int16_t)buffer[5]) << 8) | buffer[4]) >> 6;
}
debug sonrası:
(https://i.hizliresim.com/JOXOVE.png)
Harmony bilmiyorum ama benim PIC18 için I2C rutinlerim şu şekilde
Write
void I2C_WriteData(uint8_t slaveAddr, uint8_t regAddr, uint8_t data)
{
I2C_State(I2C_State_Start);
I2C_Address(slaveAddr, I2C_WRITE);
I2C_Write(regAddr);
I2C_Write(data);
I2C_State(I2C_State_Stop);
}
Read
void I2C_ReadData(uint8_t slaveAddr, uint8_t regAddr, uint8_t *data)
{
I2C_State(I2C_State_Start);
I2C_Address(slaveAddr, I2C_WRITE);
I2C_Write(regAddr);
I2C_State(I2C_State_Restart);
I2C_Address(slaveAddr, I2C_READ);
*data = I2C_Read(I2C_NACK);
I2C_State(I2C_State_Stop);
}
@baran123 peki idle, ack veya nack işlemleri nerede yapılıyor? Start ve write fonksiyonlarında mı tanımlı?
Evet fonksiyonların içinde yapılıyor.
Şurası size I2C'nin temel rutinlerin hakkında örnek sağlar.
https://electrosome.com/i2c-pic-microcontroller-mplab-xc8/
@baran123 o fonksiyonların içerisinde yazanları buraya ekleyebilir misiniz? Yoldayım, telefondan zor bulurum muhtemelen