DRIVER tổng hợp cho những thứ cần thiết đây. HOT !

Dưới đây là driver do mình làm lại từ cái CMSIS, đa test qua cai pwm timer16_0 rồi, máy bạn tải về xài thử góp ý.

View attachment src_1_.rar

các bạn có thể test bằng 1 project đơn giản sau:

#include "my_functions.h"



/* Main Program */

int main (void)
{
timer16_pwm_init( 0, 1000, MAT_CHANNEL0|MAT_CHANNEL1);
timer16_setMatch(0,0, 0);
timer16_setMatch(0,1, 500);
timer16_enable(0);
while(1);
}

nối 2 con led vào P0.8 và P0.9 để quan sát độ sáng của led, nếu có board xpresso thì có thể đặt lại giá trị của MR0 và MR1 để thay đổi độ sáng.
Để đặt giá trị cho thanh ghi, ta chọn Peropherals, chọn TMR16B0, ta có 1 bảng thanh ghi liên quan tới TMR16B0, tha hồ mà chỉnh.
Đọc kĩ hướng dẫn trước khi sử dụng ( nhất là mấy bạn có xpresso ).
Có những hàm giống với driver trong gói CMSIS nhưng hầu như đã được tinh giảm và correct lại, cái này mới làm được 1 ngày,test chưa hết mong nhận được đóng góp.
Chúc vui!
 
Thêm 1 demo nữa cho mấy bạn nè, nhưng trước tiên cần điều chỉn chút ít:

các bạn sửa trong file my_functions.c
tìm hàm void systick_based_delay(uint32_t *pointer, uint32_t delay)
sửa lại là

void systick_based_delay(uint32_t *pointer, uint32_t delay)
{
uint32_t tmp;
tmp = *pointer;
tmp += delay;
while(*pointer<=tmp);
return;
}


và đây là demo cho em nó:




#include "my_functions.h"

uint32_t ticks;

void SysTick_Handler(void)
{
ticks++;
}

/* Main Program */

int main (void)
{
GPIO_Init();
GPIO_SetDir( 0, 7, 1 );
GPIO_SetValue( 0, 7, 0 );
system_tick_config(100);

while(1)
{
GPIO_SetValue( 0, 7, 1 );
systick_based_delay(&ticks, 10);
GPIO_SetValue( 0, 7, 0 );
systick_based_delay(&ticks, 10);
}

while(1);
}

Mình cảm thấy rất dễ cho các bạn nếu sử dụng cáil lib này. Chúc thành công!
 
Thêm 1 cách sử dụng systick nữa đây, trong demo này, các bạn hãy chú ý những tác vụ thực thi trong handler của systick :



#include "my_functions.h"

uint32_t ticks;
uint32_t flag = 0;

void SysTick_Handler(void)
{
ticks++;
if(flag)
{
GPIO_SetValue( 0, 7, 1 );
flag++;
}
else
{
GPIO_SetValue( 0, 7, 0 );
flag--;
}

}

/* Main Program */

int main (void)
{
GPIO_Init();
GPIO_SetDir( 0, 7, 1 );
GPIO_SetDir( 0, 8, 1 );
GPIO_SetDir( 0, 9, 1 );

GPIO_SetValue( 0, 9, 0 );
GPIO_SetValue( 0, 8, 0 );
GPIO_SetValue( 0, 7, 0 );

system_tick_config(100);

while(1)
{
GPIO_SetValue( 0, 9, 0 );
GPIO_SetValue( 0, 8, 1 );
systick_based_delay(&ticks, 10);

GPIO_SetValue( 0, 9, 1 );
GPIO_SetValue( 0, 8, 0 );
systick_based_delay(&ticks, 10);
}

while(1);
}
 
Demo ADC, up lại cái thư viện, ADC luôn chạy ở BURST mode, xài 1 kênh thì có thể chọn clock là 24 000 000, xài nhiều kênh thì clock là 960 000, vì khi chọn clock cao quá thì kết quả thu được sẽ bị ảnh hưởng lẫn nhau, code đã test và free bug bằng xpresso, thư viện đã update lại trong bài đầu.

code demo adc:



#include "my_functions.h"


/* Main Program */

int main (void)
{
uint16_t adc_value[2];
uint32_t count;
ADC_init(960000, ADCHANNEL1|ADCHANNEL0);
ADC_BUSRT_commmand();
while(1)
{
for(count = 1000000; count<100000 ; count ++);

adc_value[0] = ADC_read_value( 0 );

adc_value[1] = ADC_read_value( 1 );
}
while(1);
}

chúc thành công !
 
Demo cho read in GPIO:



#include "my_functions.h"


/* Main Program */

int main (void)
{
GPIO_SetDir( 0, 7, 1 );
GPIO_SetDir( 0, 2, 0 );
while(1)
{
if(GPIO_getBitvalue(0, 2))
GPIO_SetValue( 0, 7, 1 );
else
GPIO_SetValue( 0, 7, 0 );
}
}
 
Đã thêm phần ngắt ngoài và test, bản driver cập nhật mới nhất !

View attachment src_3.rar

Demo cho ngắt ngoài:



#include "my_functions.h"

uint32_t count;
void PIOINT0_IRQHandler();
void PIOINT0_IRQHandler()
{
uint32_t tmp;
tmp = GPIO_IntStatus( 0, 2 );
if(tmp)
{
GPIO_IntClear( 0, 2 );
count++;
}
else
count=0;
//int flag should be clear
//read int status GPIO_IntStatus( PORT, PIN );
//clear int status GPIO_IntClear( PORT, PIN );

}
/* Main Program */

int main (void)
{
GPIO_Init();
GPIO_SetDir( 0, 2, 0 );

//port 0 bit 2, ngắt cạnh, ngắt đơn cạnh, cạnh xuống
GPIO_SetInterrupt( 0, 2, 0, 1, 1 );
GPIO_IntEnable( 0, 2 );
while(1);
}
 
Driver I2C

Chào bạn, driver I2C có trong gói example của NXP có phân ra 2 kiểu sử dụng là master hoặc slave hoặc vừa master vừa slave trong multi master bus. Bạn có thể xem các ví dụ đã có sẵn ( rất rõ ràng). Có thắc mắc gì bạn cứ hỏi. Lưu ý là các buffer cùa I2C đã được khai báo bên file .c vì thế để sử dụng được bên main thì bạn phải dùng "extern". Vì driver trong gói này không chính quy cho lắm nên việc sử dụng khá cứng nhắc nhưng vẫn tạm sử dụng được. Về phần set bitrate cho i2c, bạn nên coi thêm trong hàm để có thể chọn tốc độ phù hợp. []==[]
 

2death

Cố Vấn CLB
Staff member
Chào bạn, driver I2C có trong gói example của NXP có phân ra 2 kiểu sử dụng là master hoặc slave hoặc vừa master vừa slave trong multi master bus. Bạn có thể xem các ví dụ đã có sẵn ( rất rõ ràng). Có thắc mắc gì bạn cứ hỏi. Lưu ý là các buffer cùa I2C đã được khai báo bên file .c vì thế để sử dụng được bên main thì bạn phải dùng "extern". Vì driver trong gói này không chính quy cho lắm nên việc sử dụng khá cứng nhắc nhưng vẫn tạm sử dụng được. Về phần set bitrate cho i2c, bạn nên coi thêm trong hàm để có thể chọn tốc độ phù hợp. []==[]
Nếu được, phiền em giải thích rõ ràng (vì mấy đứa hỏi ở đây là k09 nói chung còn đang là gà, ke ke chưa biết gì đâu, hướng dẫn được cụ thể thì tốt lắm :) )
 
Cụ thể là thế này, trong gói example đó, ta có tất cả 2 project mẫu là i2c và i2c_slave.
Vì các bạn đa số dùng master mode nên ở đây mình xin giải thích mode này ( mode slave không rành lắm ).

Trước tiên là bạn nên sửa lại define cua BUFSIZE để phù hợp với yêu cầu giao tiếp vì giá trị này định nghĩa size của I2CMasterBuffer, chú ý rằng cái buffer này chứa cả dữ liệu gửi đi lẫn nhận về. khi muốn truyền đi, lần lượt gán giá trị các phần tử trong buffer:

I2CWriteLength = 6;
I2CReadLength = 0;
I2CMasterBuffer[0] = PCF8594_ADDR;
I2CMasterBuffer[1] = 0x00; /* address */
I2CMasterBuffer[2] = 0x55; /* Data0 */
I2CMasterBuffer[3] = 0xAA; /* Data1 */
I2CMasterBuffer[4] = 0x12; /* Data0 */
I2CMasterBuffer[5] = 0x34; /* Data1 */

I2CEngine();

đây là 1 frame cho con eeprom pcf8594, frame này là frame ghi, ghi liên tiếp 2 word vô trong eeprom. I2CWriteLength quy định số byte gửi đi. I2CReadLength quy định số byte nhận về và tất nhiên bằng 0 là do frame này chỉ ghi dữ liệu.

Một ví dụ về đọc dữ liệu:

I2CWriteLength = 2;
I2CReadLength = 4;
I2CMasterBuffer[0] = PCF8594_ADDR;
I2CMasterBuffer[1] = 0x00; /* address */
I2CMasterBuffer[2] = PCF8594_ADDR | RD_BIT;

I2CEngine();

Tương tự, master truyền đi địa chỉ slave rồi word address, sau đo phài tạo start condition rồi gửi địa chỉ slave với bit read ( đây là lý do tại sao i2c chỉ có 7 bit địa chỉ). Tiếp đến là đọc vào. Ở đây, example có đề cập là data read về bỏ vô sau I2CMasterBuffer[I2CWriteLength+2], chỗ này chưa hiểu lắm, cần phải có mạch cụ thể để demo. em có thể mang con IC đó lên trường để bạn nào có xpresso test thử.
 

2death

Cố Vấn CLB
Staff member
Lại phải nhấn nút thanks, ke ke ke.
Tiện thể làm luôn SPI nhé hé hé :D

Viết 1 bài khác về SPI luôn để các bạn dễ đọc :)
 
Driver IIC

đã làm xong nhưng chưa có đồ để test lại, chờ mình test rồi release luôn IIC với UART (thực ra là port từ M3 qua ).
 
Anh cho em hỏi sao em thử code adc trên keil uvision 4.21 không được vậy? Có phải anh thử bằng code red không?
 
Xong !

Đã xong và test thử roài. File này bao gồm driver UART và 1 vài cái framework cho UART, thêm driver IIC nữa.
View attachment src_4.rar

Chúc thành công !
PS: SPI không có đồ để test, ai cho mình mượn đồ để test thì mới làm được.
 

2death

Cố Vấn CLB
Staff member
Chiều nay em có lên trường không, lấy board học PIC để test nhé [trên board có 1 epprom], có thể ghi - đọc epprom này để test SPI. Thank em :)
 
Về driver spi

Lpc1114 không có module SPI riêng biệt mà gộp chung lại với 1 số các giao tiếp khác tạo thành module SSP, các bạn có thể xem qua ví dụ SSP trong gói example của lpc1114. Ví dụ này mặc định là chạy chương trình test spi eeprom, dùng nó để tham khảo cách dùng. Mình cũng không thể cung cấp chi tiết hơn được cái ví dụ này. Chú ý là có 2 SSP nên có thể chọn 1 trong 2 bằng cách khai báo:
#define SSP_NUM 1

recommmend là dùng SSP1.
:confused:
 
Top