添加PAN159资料

This commit is contained in:
SXHome
2021-09-26 17:19:12 +08:00
parent 2109411cf7
commit 7fd213ef33
3783 changed files with 1783056 additions and 0 deletions
@@ -0,0 +1,138 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_adc_pan159.c
* @brief
*
* ADC对应的IO口:
* ---------+-----------
* ADC_CH0 | P5.3(5)
* ---------+-----------
* ADC_CH1 | P1.0(7)
* ---------+-----------
* ADC_CH2 | P1.2(8)
* ---------+-----------
* ADC_CH3 | P1.3(9)
* ---------+-----------
* ADC_CH4 | P1.4(10)
* ---------+-----------
* ADC_CH5 | P1.5(11)
* ---------+-----------
* ADC_CH6 | P3.0(13)
* ---------+-----------
* ADC_CH7 | P3.1(17)
* ---------+-----------
*
* @history - V1.0, 2017-09-18, xiaoguolin, first implementation.
*******************************************************************************/
#include "lib_driver_adc_pan159.h"
const static uint8_t adc_chns_table[] = {
#if ADC_ENABLE_CH0_P53 != 0
ADC_PAN159_CH0_P53,
#endif
#if ADC_ENABLE_CH1_P10 != 0
ADC_PAN159_CH1_P10,
#endif
#if ADC_ENABLE_CH2_P12 != 0
ADC_PAN159_CH2_P12,
#endif
#if ADC_ENABLE_CH3_P13 != 0
ADC_PAN159_CH3_P13,
#endif
#if ADC_ENABLE_CH4_P14 != 0
ADC_PAN159_CH4_P14,
#endif
#if ADC_ENABLE_CH5_P15 != 0
ADC_PAN159_CH5_P15,
#endif
#if ADC_ENABLE_CH6_P30 != 0
ADC_PAN159_CH6_P30,
#endif
#if ADC_ENABLE_CH7_P31 != 0
ADC_PAN159_CH7_P31,
#endif
0x00
};
#define ADC_CHN_NUM_COUNT (sizeof(adc_chns_table)-1)
static int8_t adc_cur_chn_index = 0;
void adc_pan159_init(void)
{
ADC_POWER_ON(ADC);
if(ADC_ENABLE_CH0_P53){
SYS->P5_MFP &= ~SYS_MFP_P53_Msk;
SYS->P5_MFP |= SYS_MFP_P53_ADC_CH0;
GPIO_DISABLE_DIGITAL_PATH(P5,BIT3);
}
if(ADC_ENABLE_CH1_P10){
SYS->P1_MFP &= ~SYS_MFP_P10_Msk;
SYS->P1_MFP |= SYS_MFP_P10_ADC_CH1;
GPIO_DISABLE_DIGITAL_PATH(P1,BIT0);
}
if(ADC_ENABLE_CH2_P12){
SYS->P1_MFP &= ~SYS_MFP_P12_Msk;
SYS->P1_MFP |= SYS_MFP_P12_ADC_CH2;
GPIO_DISABLE_DIGITAL_PATH(P1,BIT2);
}
if(ADC_ENABLE_CH3_P13){
SYS->P1_MFP &= ~SYS_MFP_P13_Msk;
SYS->P1_MFP |= SYS_MFP_P13_ADC_CH3;
GPIO_DISABLE_DIGITAL_PATH(P1,BIT3);
}
if(ADC_ENABLE_CH4_P14){
SYS->P1_MFP &= ~SYS_MFP_P14_Msk;
SYS->P1_MFP |= SYS_MFP_P14_ADC_CH4;
GPIO_DISABLE_DIGITAL_PATH(P1,BIT4);
}
if(ADC_ENABLE_CH5_P15){
SYS->P1_MFP &= ~SYS_MFP_P15_Msk;
SYS->P1_MFP |= SYS_MFP_P15_ADC_CH5;
GPIO_DISABLE_DIGITAL_PATH(P1,BIT5);
}
if(ADC_ENABLE_CH6_P30){
SYS->P3_MFP &= ~SYS_MFP_P30_Msk;
SYS->P3_MFP |= SYS_MFP_P30_ADC_CH6;
GPIO_DISABLE_DIGITAL_PATH(P3,BIT0);
}
if(ADC_ENABLE_CH7_P31){
SYS->P3_MFP &= ~SYS_MFP_P31_Msk;
SYS->P3_MFP |= SYS_MFP_P31_ADC_CH7;
GPIO_DISABLE_DIGITAL_PATH(P3,BIT1);
}
}
void adc_pan159_samp2(uint16_t *buf)
{
/* 获取当前通道 */
//uint8_t curr_index = adc_cur_chn_index;
//int16_t curr_chn = adc_chns_table[curr_index];
//adc_pan159_start(adc_chns_table[adc_cur_chn_index],6);
ADC->CHEN = adc_chns_table[adc_cur_chn_index];
ADC->EXTSMPT = (ADC->EXTSMPT & ~ADC_EXTSMPT_EXTSMPT_Msk) | 6;
ADC_START_CONV(ADC);
while(adc_pan159_is_busy());
/* 读取ADC转换结果 */
buf[adc_cur_chn_index] = adc_pan159_value();
/* 计算下一个通道 */
if(adc_cur_chn_index < ADC_CHN_NUM_COUNT-1){
adc_cur_chn_index++;
}
else{
adc_cur_chn_index = 0;
}
}
void adc_pan159_samp1(uint16_t *buf)
{
ADC->CHEN = ADC_PAN159_CH3_P13;
//ADC->CHEN = ADC_PAN159_CH1_P10 ;
ADC->EXTSMPT = (ADC->EXTSMPT & ~ADC_EXTSMPT_EXTSMPT_Msk) | 6;
ADC_START_CONV(ADC);
while(adc_pan159_is_busy());
/* 读取ADC转换结果 */
buf[0] = adc_pan159_value();
}
@@ -0,0 +1,67 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_adc_pan159.h
* @brief
*
* ADC¶ÔÓ¦µÄIO¿Ú:
* ---------+-----------
* ADC_CH0 | P5.3(5)
* ---------+-----------
* ADC_CH1 | P1.0(7)
* ---------+-----------
* ADC_CH2 | P1.2(8)
* ---------+-----------
* ADC_CH3 | P1.3(9)
* ---------+-----------
* ADC_CH4 | P1.4(10)
* ---------+-----------
* ADC_CH5 | P1.5(11)
* ---------+-----------
* ADC_CH6 | P3.0(13)
* ---------+-----------
* ADC_CH7 | P3.1(17)
* ---------+-----------
*
* @history - V1.0, 2017-09-18, xiaoguolin, first implementation.
*******************************************************************************/
#ifndef __LIB_DIRVER_ADC_PAN159_H
#define __LIB_DIRVER_ADC_PAN159_H
#ifdef __cplusplus
extern "C"{
#endif
#include "Mini58Series.h"
#define ADC_ENABLE_CH0_P53 0
#define ADC_ENABLE_CH1_P10 0
#define ADC_ENABLE_CH2_P12 0
#define ADC_ENABLE_CH3_P13 1
#define ADC_ENABLE_CH4_P14 0
#define ADC_ENABLE_CH5_P15 0
#define ADC_ENABLE_CH6_P30 0
#define ADC_ENABLE_CH7_P31 0
#define ADC_PAN159_CH0_P53 (1<<0)
#define ADC_PAN159_CH1_P10 (1<<1)
#define ADC_PAN159_CH2_P12 (1<<2)
#define ADC_PAN159_CH3_P13 (1<<3)
#define ADC_PAN159_CH4_P14 (1<<4)
#define ADC_PAN159_CH5_P15 (1<<5)
#define ADC_PAN159_CH6_P30 (1<<6)
#define ADC_PAN159_CH7_P31 (1<<7)
void adc_pan159_init(void);
void adc_pan159_start(uint8_t chn, uint8_t smplclks);
void adc_pan159_samp2(uint16_t *buf);
void adc_pan159_samp1(uint16_t *buf);
#define adc_pan159_value() ADC_GET_CONVERSION_DATA(ADC,NULL)
#define adc_pan159_is_busy() ADC_IS_BUSY(ADC)
#ifdef __cplusplus
}
#endif
#endif //__LIB_DIRVER_ADC_PAN159_H
@@ -0,0 +1,18 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_delay_pan159.c
* @brief PAN159 delay
*
* @history - V1.0, 2017-09-12, xiaoguolin, first implementation.
*******************************************************************************/
#include "lib_driver_delay_pan159.h"
__ASM void __delay_pan159(uint32_t cycle)
{
__delay_pan159_loop
SUBS r0,r0,#1
BCS __delay_pan159_loop
BX lr
}
@@ -0,0 +1,32 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_delay_pan159_v1p0.h
* @brief PAN159 delay
* 注意:该延时函数在系统时钟为48MHz时准确
*
* @history - V1.0, 2017-09-12, xiaoguolin, first implementation.
*******************************************************************************/
#ifndef __DRIVER_DELAY_PAN159_H
#define __DRIVER_DELAY_PAN159_H
#ifdef __cplusplus
extern "C"{
#endif
#include "Mini58Series.h"
void __delay_pan159(uint32_t cycle);
#define delay_pan159_us(us) do{if((us)){__delay_pan159((us)*12);}}while(0)
#define delay_pan159_ms(ms) do{uint32_t cnt=(ms);while(cnt--){delay_pan159_us(2070);}}while(0)
#define delay_us delay_pan159_us
#define delay_ms delay_pan159_ms
#ifdef __cplusplus
}
#endif
#endif // __DRIVER_DELAY_PAN159_H
@@ -0,0 +1,136 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file drv_flash.c
* @brief FLASH读写
*
* @history - V1.0, 2017-03-10, xiaoguolin, first implementation.
*******************************************************************************/
#include "lib_driver_flash_pan159.h"
/*******************************************************************************
* @brief FLASH擦除扇区(512字节)
* @param[in] addr - 起始地址(512字节对齐)
* sectors - 要擦除的连续扇区数目
* @param[out] 无
* @return 无
* @history - V1.0, 2017-03-13, xiaoguolin, first implementation.
*******************************************************************************/
void flash_pan159_erase(uint32_t addr, uint16_t sectors)
{
SYS_UnlockReg();
FMC_Open();
FMC_ENABLE_SP_UPDATE();
while(sectors != 0)
{
FMC_Erase(addr);
addr += 128;
sectors--;
}
FMC_DISABLE_SP_UPDATE();
FMC_Close();
SYS_LockReg();
}
/*******************************************************************************
* @brief FLASH数据写入
* @param[in] addr - 写入起始地址,要求4字节对齐
* p_addr - 数据指针
* len - 数据长度(字节为单位)
* @param[out] 无
* @return 无
* @history - V1.0, 2017-03-13, xiaoguolin, first implementation.
*******************************************************************************/
void flash_pan159_write(uint32_t addr, void* p_data, uint16_t len)
{
#define PTR32 ((uint32_t*)p_data)
#define PTR8 ((uint8_t*)p_data)
uint16_t i;
union{
uint32_t u32;
struct{
uint8_t x0;
uint8_t x1;
uint8_t x2;
uint8_t x3;
}u8;
}tmp;
tmp.u32 = 0xFFFFFFFF;
SYS_UnlockReg();
FMC_Open();
FMC_ENABLE_SP_UPDATE();
for(i = 0; i < (len>>2); i++)
{
FMC_Write(addr,PTR32[i]);
addr += 4;
}
i <<= 2;
if(i < len)
{
tmp.u8.x0 = PTR8[i++];
if(i < len)
{
tmp.u8.x1 = PTR8[i++];
if(i < len)
{
tmp.u8.x2 = PTR8[i];
}
}
FMC_Write(addr,tmp.u32);
}
FMC_DISABLE_SP_UPDATE();
FMC_Close();
SYS_LockReg();
#undef PTR8
#undef PTR32
}
/*******************************************************************************
* @brief FLASH数据读取
* @param[in] addr - 读取起始地址,要求4字节对齐
* len - 数据长度(字节为单位)
* @param[out] p_data - 数据缓冲区指针,帯回数据
* @return 无
* @history - V1.0, 2017-03-13, xiaoguolin, first implementation.
*******************************************************************************/
void flash_pan159_read(uint32_t addr, void* p_data, uint16_t len)
{
#define PTR32 ((uint32_t*)p_data)
#define PTR8 ((uint8_t*)p_data)
#define TMP (*((uint32_t*)tmp))
uint16_t i;
uint8_t tmp[4];
SYS_UnlockReg();
FMC_Open();
FMC_ENABLE_SP_UPDATE();
for(i = 0; i < (len>>2); i++)
{
PTR32[i] = FMC_Read(addr);
addr += 4;
}
i <<= 2;
if(i < len)
{
TMP = FMC_Read(addr);
PTR8[i++] = tmp[0];
if(i < len)
{
PTR8[i++] = tmp[1];
if(i < len)
{
PTR8[i] = tmp[2];
}
}
}
FMC_DISABLE_SP_UPDATE();
FMC_Close();
SYS_LockReg();
#undef TMP
#undef PTR8
#undef PTR32
}
@@ -0,0 +1,26 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file drv_flash.h
* @brief FLASH¶Áд
*
* @history - V1.0, 2017-03-10, xiaoguolin, first implementation.
*******************************************************************************/
#ifndef __DRV_FLASH_H
#define __DRV_FLASH_H
#ifdef __cplusplus
extern "C"{
#endif
#include "Mini58Series.h"
void flash_pan159_erase(uint32_t addr, uint16_t sectors);
void flash_pan159_write(uint32_t addr, void* p_data, uint16_t len);
void flash_pan159_read(uint32_t addr, void* p_data, uint16_t len);
#ifdef __cplusplus
}
#endif
#endif // __DRV_FLASH_H
@@ -0,0 +1,51 @@
/*******************************************************************************
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_gpio_pan159.c
* @brief PAN159 hardware gpioÇý¶¯
*
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
*******************************************************************************/
#include "lib_driver_gpio_pan159.h"
typedef void (*TCallback)(void);
static void (*__s_lib_driver_EINT1_pan159_irq_handler)(void) = NULL;
static void (*__s_lib_driver_EINT0_pan159_irq_handler)(void) = NULL;
void gpio_ext1_int_init(TCallback cbk)
{
if(cbk){
GPIO_EnableEINT1(P5, 2, GPIO_INT_FALLING);
NVIC_EnableIRQ(EINT1_IRQn);
}
__s_lib_driver_EINT1_pan159_irq_handler = cbk;
}
void gpio_ext0_int_init(TCallback cbk)
{
GPIO_SetMode(P3, BIT2, GPIO_MODE_INPUT);
if(cbk){
GPIO_EnableEINT1(P3, 2, GPIO_INT_FALLING);
NVIC_EnableIRQ(EINT0_IRQn);
}
__s_lib_driver_EINT0_pan159_irq_handler = cbk;
}
void EINT0_IRQHandler(void)
{
/* For P3.2, clear the INT flag */
P3->INTSRC = BIT2;
if(__s_lib_driver_EINT0_pan159_irq_handler){
__s_lib_driver_EINT0_pan159_irq_handler();
}
}
void EINT1_IRQHandler(void)
{
/* For P5.2, clear the INT flag */
P5->INTSRC = BIT2;
if(__s_lib_driver_EINT1_pan159_irq_handler){
__s_lib_driver_EINT1_pan159_irq_handler();
}
}
@@ -0,0 +1,26 @@
/*******************************************************************************
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_gpio_pan159.c
* @brief PAN159 hardware gpioÇý¶¯
*
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
*******************************************************************************/
#ifndef __LIB_DRIVER_GPIO_PAN159_H
#define __LIB_DRIVER_GPIO_PAN159_H
#ifdef __cplusplus
extern "C"{
#endif
#include "Mini58Series.h"
typedef void (*TCallback)(void);
void gpio_ext1_int_init(TCallback cbk);
void gpio_ext0_int_init(TCallback cbk);
#ifdef __cplusplus
}
#endif
#endif //__LIB_DRIVER_GPIO_PAN159_H
@@ -0,0 +1,216 @@
/*******************************************************************************
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_iic_pan159.c
* @brief PAN159 hardware IICÇý¶¯
*
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
*******************************************************************************/
#include "lib_driver_iic_pan159.h"
//#include <string.h>
uint8_t g_u8DeviceAddr;
uint8_t g_u8RegAddr;
//uint8_t g_au8TxData[64];
//uint8_t g_u8RxData[64];
uint8_t g_u8DataLen;
uint8_t g_u8DataLenMax;
uint8_t __IO g_u8EndFlag = 0;
typedef void (*TCallback)(void);
typedef void (*I2C_FUNC)(uint32_t u32Status,uint8_t *buf,TCallback cbk, TCallback fail_cbk);
I2C_FUNC __IO s_I2CHandlerFn = NULL;
TCallback __IO cbk_success = NULL;
TCallback __IO cbk_failed = NULL;
uint8_t* buf_addr = NULL;
/*---------------------------------------------------------------------------------------------------------*/
/* I2C IRQ Handler */
/*---------------------------------------------------------------------------------------------------------*/
void I2C0_IRQHandler(void)
{
uint32_t u32Status;
u32Status = I2C_GET_STATUS(I2C0);
if (I2C_GET_TIMEOUT_FLAG(I2C0)) {
/* Clear I2C Timeout Flag */
I2C_ClearTimeoutFlag(I2C0);
}
else {
if (s_I2CHandlerFn != NULL)
s_I2CHandlerFn(u32Status,buf_addr,cbk_success,cbk_failed);
}
}
void iic_pan159_init(void)
{
//uint32_t u32Div;
CLK_EnableModuleClock(I2C0_MODULE);
SYS->P3_MFP &= ~SYS_MFP_P34_Msk;
SYS->P3_MFP |= SYS_MFP_P34_I2C0_SDA;
SYS->P3_MFP &= ~SYS_MFP_P35_Msk;
SYS->P3_MFP |= SYS_MFP_P35_I2C0_SCL;
SYS->IPRST1 |= SYS_IPRST1_I2C0RST_Msk;
SYS->IPRST1 &= ~SYS_IPRST1_I2C0RST_Msk;
I2C_Open(I2C0,400000);
// u32Div = (uint32_t) (((SystemCoreClock * 10)/(400000 * 4) + 5) / 10 - 1); /* Compute proper divider for I2C clock */
// I2C0->CLKDIV = u32Div;
// I2C0->CTL |= I2C_CTL_I2CEN_Msk;
I2C0->CTL |= I2C_CTL_INTEN_Msk;
NVIC_EnableIRQ(I2C0_IRQn);
}
void iic_master_tx(uint32_t u32Status ,uint8_t *buf, TCallback cbk, TCallback fail_cbk)
{
if (u32Status == 0x08) { /* START has been transmitted */
I2C_SET_DATA(I2C0, g_u8DeviceAddr << 1); /* Write SLA+W to Register I2CDAT */
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
}
else if (u32Status == 0x18) { /* SLA+W has been transmitted and ACK has been received */
I2C_SET_DATA(I2C0, g_u8RegAddr);
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
}
else if (u32Status == 0x20) { /* SLA+W has been transmitted and NACK has been received */
I2C_SET_CONTROL_REG(I2C0, I2C_STO | I2C_SI);
}
else if (u32Status == 0x28) { /* DATA has been transmitted and ACK has been received */
if (g_u8DataLen != g_u8DataLenMax) {
I2C_SET_DATA(I2C0, buf[g_u8DataLen++]);
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
} else {
I2C_SET_CONTROL_REG(I2C0, I2C_STO | I2C_SI);
g_u8EndFlag = 1;
if(cbk != NULL)
{
cbk();
}
}
}
else {
if(fail_cbk != NULL)
{
fail_cbk();
}
//I2C_STOP(I2C0);
//(I2C0)->CTL |= (I2C_CTL_SI_Msk | I2C_CTL_STO_Msk);
/* TO DO */
// printf("Status 0x%x is NOT processed\n", u32Status);
}
}
void iic_master_rx(uint32_t u32Status ,uint8_t *buf,TCallback cbk, TCallback fail_cbk){
if (u32Status == 0x08) { /* START has been transmitted and prepare SLA+W */
I2C_SET_DATA(I2C0, g_u8DeviceAddr << 1); /* Write SLA+W to Register I2CDAT */
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
}
else if (u32Status == 0x18) { /* SLA+W has been transmitted and ACK has been received */
I2C_SET_DATA(I2C0, g_u8RegAddr);
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
}
else if (u32Status == 0x20) { /* SLA+W has been transmitted and NACK has been received */
I2C_SET_CONTROL_REG(I2C0, I2C_STO | I2C_SI);
}
else if (u32Status == 0x28) { /* DATA has been transmitted and ACK has been received */
I2C_SET_CONTROL_REG(I2C0, I2C_STA | I2C_SI);
}
else if (u32Status == 0x10) { /* Repeat START has been transmitted and prepare SLA+R */
I2C_SET_DATA(I2C0, ((g_u8DeviceAddr << 1) | 0x01)); /* Write SLA+R to Register I2CDAT */
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
}
else if (u32Status == 0x40) { /* SLA+R has been transmitted and ACK has been received */
if(g_u8DataLenMax== 1)
{
I2C_SET_CONTROL_REG(I2C0, I2C_SI );
}
else{
I2C_SET_CONTROL_REG(I2C0, I2C_SI | I2C_AA );
}
}
else if (u32Status == 0x50) { /* DATA has been received and ACK has been returned */
if(g_u8DataLen != g_u8DataLenMax-2){
buf[g_u8DataLen++] = I2C_GET_DATA(I2C0);
I2C_SET_CONTROL_REG(I2C0, I2C_SI | I2C_AA);
}
else{
buf[g_u8DataLen++] = I2C_GET_DATA(I2C0);
I2C_SET_CONTROL_REG(I2C0, I2C_SI );
}
}
else if (u32Status == 0x58) { /* DATA has been received and NACK has been returned */
buf[g_u8DataLen++] = I2C_GET_DATA(I2C0);
I2C_SET_CONTROL_REG(I2C0, I2C_STO | I2C_SI);
g_u8EndFlag = 1;
if(cbk != NULL)
{
cbk();
}
}
else {
if(fail_cbk != NULL)
{
fail_cbk();
}
//(I2C0)->CTL |= (I2C_CTL_SI_Msk | I2C_CTL_STO_Msk);
//I2C_STOP(I2C0);
/* TO DO */
//printf("Status 0x%x is NOT processed\n", u32Status);
}
}
void iic_start_send_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk)
{
I2C0->CTL |= I2C_CTL_I2CEN_Msk;
I2C0->CTL |= I2C_CTL_INTEN_Msk;
g_u8DataLenMax = len;
g_u8DeviceAddr = devAddr;
g_u8RegAddr = regAddr;
g_u8DataLen = 0;
g_u8EndFlag = 0;
/* I2C function to write data to slave */
s_I2CHandlerFn = (I2C_FUNC)iic_master_tx;
cbk_success = cbk;
cbk_failed = fail_cbk;
buf_addr = buf;
/* I2C as master sends START signal */
I2C_START(I2C0);
}
void iic_start_read_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk)
{
I2C0->CTL |= I2C_CTL_I2CEN_Msk;
I2C0->CTL |= I2C_CTL_INTEN_Msk;
g_u8DataLenMax = len;
g_u8DeviceAddr = devAddr;
g_u8RegAddr = regAddr;
g_u8DataLen = 0;
g_u8EndFlag = 0;
s_I2CHandlerFn = (I2C_FUNC)iic_master_rx;
cbk_success = cbk;
cbk_failed = fail_cbk;
buf_addr = buf;
//CLK_SysTickDelay(5000);
/* I2C as master sends START signal */
I2C_START(I2C0);
//while (g_u8EndFlag == 0);
}
uint8_t is_iic_busy(void)
{
if(g_u8EndFlag){
return 0;
}
else{
return 1;
}
}
@@ -0,0 +1,27 @@
/*******************************************************************************
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_iic_pan159.c
* @brief PAN159 hardware IICÇý¶¯
*
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
*******************************************************************************/
#ifndef __LIB_DIRVER_IIC_PAN159_H
#define __LIB_DIRVER_IIC_PAN159_H
#ifdef __cplusplus
extern "C"{
#endif
#include "Mini58Series.h"
typedef void (*TCallback)(void);
void iic_pan159_init(void);
void iic_start_send_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk);
void iic_start_read_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk);
uint8_t is_iic_busy(void);
#ifdef __cplusplus
}
#endif
#endif // __LIB_DIRVER_IIC_PAN159_H
@@ -0,0 +1,166 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file drv_pwm.c
* @brief PWM驱动
* ----------+----------+----------+----------
* PWM0_CH0 | | P1.2(8) | P2.2(24)
* ----------+----------+----------+----------
* PWM0_CH1 | | P1.3(9) | P2.3(25)
* ----------+----------+----------+----------
* PWM0_CH2 | | | P2.4(26)
* ----------+----------+----------+----------
* PWM0_CH3 | | | P2.5(27)
* ----------+----------+----------+----------
* PWM0_CH4 | | P1.4(10) | P2.6(28)
* ----------+----------+----------+----------
* PWM0_CH5 | P0.4(15) | |
* ----------+----------+----------+----------
*
* @history - V1.0, 2017-04-20, xiaoguolin, first implementation.
* @history - V1.1, 2018-01-18, huoweibin, add pwm_pan159_setDuty.
*******************************************************************************/
#include "lib_driver_pwm_pan159.h"
// <0x50=>PWM0_CH0_P12 (CHIP_PIN_8)
// <0x90=>PWM0_CH0_P22 (CHIP_PIN_24)
// <0x59=>PWM0_CH1_P13 (CHIP_PIN_9)
// <0x99=>PWM0_CH1_P23 (CHIP_PIN_25)
// <0xA2=>PWM0_CH2_P24 (CHIP_PIN_26)
// <0xAB=>PWM0_CH3_P25 (CHIP_PIN_27)
// <0x64=>PWM0_CH4_P14 (CHIP_PIN_10)
// <0xB4=>PWM0_CH4_P26 (CHIP_PIN_28)
// <0x25=>PWM0_CH5_P04 (CHIP_PIN_15)
//#define __PWM_PAN159_M0 0xA2 //P24
//#define __PWM_PAN159_M1 0x99 //P23
//#define __PWM_PAN159_M2 0x90 //P22
//#define __PWM_PAN159_M3 0xAB //P25
/*******************************************************************************
* @brief PWM初始化
* @param[in]
* @return 1 - 成功
* 0 - 失败
* @history - V1.0, 2017-09-12, xiaoguolin, first implementation.
*******************************************************************************/
void pwm_pan159_init(uint8_t psc)
{
//const uint32_t pwmch_module[] = {PWMCH01_MODULE,PWMCH23_MODULE,PWMCH45_MODULE};
SYS_UnlockReg();
CLK_EnableModuleClock(PWMCH01_MODULE); //moudle clk enable ch01
CLK_EnableModuleClock(PWMCH23_MODULE); //moudle clk enable ch23
// CLK_SetModuleClock(PWMCH01_MODULE,CLK_CLKSEL1_PWMCH01SEL_HCLK,0);//时钟1分频
// CLK_SetModuleClock(PWMCH23_MODULE,CLK_CLKSEL1_PWMCH23SEL_HCLK,0);//时钟1分频
//CLK_EnableModuleClock(PWMCH45_MODULE); //moudle clk enable ch45
// CLK_EnableModuleClock(pwmch_module[0x03 >> 1]); //moudle clk enable ch3
SystemCoreClockUpdate();
SYS_LockReg();
//P22
SYS->P2_MFP &= ~SYS_MFP_P22_Msk;
SYS->P2_MFP |= SYS_MFP_P22_PWM0_CH0;
PWM->CTL |= PWM_CTL_CNTEN0_Msk | PWM_CTL_CNTMODE0_Msk;
//P23
SYS->P2_MFP &= ~SYS_MFP_P23_Msk;
SYS->P2_MFP |= SYS_MFP_P23_PWM0_CH1;
PWM->CTL |= PWM_CTL_CNTEN1_Msk | PWM_CTL_CNTMODE1_Msk;
//P24
SYS->P2_MFP &= ~SYS_MFP_P24_Msk;
SYS->P2_MFP |= SYS_MFP_P24_PWM0_CH2;
PWM->CTL |= PWM_CTL_CNTEN2_Msk | PWM_CTL_CNTMODE2_Msk;
//P25
SYS->P2_MFP &= ~SYS_MFP_P25_Msk;
SYS->P2_MFP |= SYS_MFP_P25_PWM0_CH3;
PWM->CTL |= PWM_CTL_CNTEN3_Msk | PWM_CTL_CNTMODE3_Msk;
PWM_SET_PRESCALER(PWM,0x02,psc);
PWM_SET_DIVIDER(PWM,0x02,PWM_CLK_DIV_1);
//PWM_SET_ALIGNED_TYPE(PWM,0x02,0x80000000);//中心对齐
PWM_SET_ALIGNED_TYPE(PWM,0x02,PWM_EDGE_ALIGNED);//边沿对齐
PWM_SET_CMR(PWM,0x02,0);
PWM_SET_CNR(PWM,0x02,1000);//PWM RANGE setting
//PWM->CTL |= 1 << (PWM_CTL_PINV0_Pos + (((uint32_t)(0x02)) << 2));//输出取反
PWM_SET_PRESCALER(PWM,0x01,psc);
PWM_SET_DIVIDER(PWM,0x01,PWM_CLK_DIV_1);
PWM_SET_ALIGNED_TYPE(PWM,0x01,PWM_EDGE_ALIGNED);
PWM_SET_CMR(PWM,0x01,0);
PWM_SET_CNR(PWM,0x01,1000);//PWM RANGE setting
//PWM->CTL |= 1 << (PWM_CTL_PINV0_Pos + (((uint32_t)(0x01)) << 2));//输出取反
PWM_SET_PRESCALER(PWM,0x00,psc);
PWM_SET_DIVIDER(PWM,0x00,PWM_CLK_DIV_1);
PWM_SET_ALIGNED_TYPE(PWM,0x00,PWM_EDGE_ALIGNED);
PWM_SET_CMR(PWM,0x00,0);
PWM_SET_CNR(PWM,0x00,1000);//PWM RANGE setting
//PWM->CTL |= 1 << (PWM_CTL_PINV0_Pos + (((uint32_t)(0x00)) << 2));//输出取反
PWM_SET_PRESCALER(PWM,0x03,psc);
PWM_SET_DIVIDER(PWM,0x03,PWM_CLK_DIV_1);
PWM_SET_ALIGNED_TYPE(PWM,0x03,PWM_EDGE_ALIGNED);
PWM_SET_CMR(PWM,0x03,0);
PWM_SET_CNR(PWM,0x03,1000);//PWM RANGE setting
//PWM->CTL |= 1 << (PWM_CTL_PINV0_Pos + (((uint32_t)(0x03)) << 2));//输出取反
/* 开启PWM */
PWM->CTL |= PWM_CTL_CNTEN0_Msk << (((uint32_t)0x00) << 2);
PWM->CTL |= PWM_CTL_CNTEN0_Msk << (((uint32_t)0x01) << 2);
PWM->CTL |= PWM_CTL_CNTEN0_Msk << (((uint32_t)0x02) << 2);
PWM->CTL |= PWM_CTL_CNTEN0_Msk << (((uint32_t)0x03) << 2);
PWM_PAN159_CHN_OUT(0x00,0);
PWM_PAN159_CHN_OUT(0x01,0);
PWM_PAN159_CHN_OUT(0x02,0);
PWM_PAN159_CHN_OUT(0x03,0);
//PWM_PAN159_CHN_UNLOCK(1<<chn);
// return pwm_port;
}
/*******************************************************************************
* @brief PWM输出
* @param[in]
* @return
* @history - V1.0, 2018-01-18, huoweibin, first implementation.
*******************************************************************************/
void pwm_pan159_setDuty(uint16_t *duty)
{
register uint8_t lock = 0x00;
register uint8_t unlock = 0x00;
/*M1 - CH1 PWM out*/
PWM_PAN159_CHN_OUT(0x01,duty[0]);
if(duty[0] == 0){
lock |= 1 << 0x01;
}
else{
unlock |= 1 << 0x01;
}
/*M2 - CH3 PWM out*/
PWM_PAN159_CHN_OUT(0x03,duty[1]);
if(duty[1] == 0){
lock |= 1 << 0x03;
}
else{
unlock |= 1 << 0x03;
}
/*M3 - CH2 PWM out*/
PWM_PAN159_CHN_OUT(0x02,duty[2]);
if(duty[2] == 0){
lock |= 1 << 0x02;
}
else{
unlock |= 1 << 0x02;
}
/*M4 - CH0 PWM out*/
PWM_PAN159_CHN_OUT(0x00,duty[3]);
if(duty[3] == 0){
lock |= 1 << 0x00;
}
else{
unlock |= 1 << 0x00;
}
PWM_PAN159_CHN_LOCK(lock);
PWM_PAN159_CHN_UNLOCK(unlock);
}
@@ -0,0 +1,76 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file drv_pwm.h
* @brief PWM驱动
* 机体坐标系(z朝下,x为机头,y为右侧):
*
* PWM对应的IO口:
* ----------+----------+----------+----------
* PWM0_CH0 | | P1.2(8) | P2.2(24)
* ----------+----------+----------+----------
* PWM0_CH1 | | P1.3(9) | P2.3(25)
* ----------+----------+----------+----------
* PWM0_CH2 | | | P2.4(26)
* ----------+----------+----------+----------
* PWM0_CH3 | | | P2.5(27)
* ----------+----------+----------+----------
* PWM0_CH4 | | P1.4(10) | P2.6(28)
* ----------+----------+----------+----------
* PWM0_CH5 | P0.4(15) | |
* ----------+----------+----------+----------
*
* @history - V1.0, 2017-04-20, xiaoguolin, first implementation.
*******************************************************************************/
#ifndef __LIB_DIRVER_PWM_PAN159_H
#define __LIB_DIRVER_PWM_PAN159_H
#ifdef __cplusplus
extern "C"{
#endif
#include "Mini58Series.h"
#define __PWM_PAN159_PORT(P) ((P)<<6)
#define __PWM_PAN159_PIN(B) ((B)<<3)
#define __PWM_PAN159_CHN(C) ((C)<<0)
#define PWM_PAN159_PWM0_CH0_P12 (__PWM_PAN159_CHN(0)|__PWM_PAN159_PORT(1)|__PWM_PAN159_PIN(2)) /* 01 010 000 = 0x50 */
#define PWM_PAN159_PWM0_CH0_P22 (__PWM_PAN159_CHN(0)|__PWM_PAN159_PORT(2)|__PWM_PAN159_PIN(2)) /* 10 010 000 = 0x90 */
#define PWM_PAN159_PWM0_CH1_P13 (__PWM_PAN159_CHN(1)|__PWM_PAN159_PORT(1)|__PWM_PAN159_PIN(3)) /* 01 011 001 = 0x59 */
#define PWM_PAN159_PWM0_CH1_P23 (__PWM_PAN159_CHN(1)|__PWM_PAN159_PORT(2)|__PWM_PAN159_PIN(3)) /* 10 011 001 = 0x99 */
#define PWM_PAN159_PWM0_CH2_P24 (__PWM_PAN159_CHN(2)|__PWM_PAN159_PORT(2)|__PWM_PAN159_PIN(4)) /* 10 100 010 = 0xA2 */
#define PWM_PAN159_PWM0_CH3_P25 (__PWM_PAN159_CHN(3)|__PWM_PAN159_PORT(2)|__PWM_PAN159_PIN(5)) /* 10 101 011 = 0xAB */
#define PWM_PAN159_PWM0_CH4_P14 (__PWM_PAN159_CHN(4)|__PWM_PAN159_PORT(1)|__PWM_PAN159_PIN(4)) /* 01 100 100 = 0x64 */
#define PWM_PAN159_PWM0_CH4_P26 (__PWM_PAN159_CHN(4)|__PWM_PAN159_PORT(2)|__PWM_PAN159_PIN(6)) /* 10 110 100 = 0xB4 */
#define PWM_PAN159_PWM0_CH5_P04 (__PWM_PAN159_CHN(5)|__PWM_PAN159_PORT(0)|__PWM_PAN159_PIN(4)) /* 00 100 101 = 0x25 */
#define PWM_PAN159_PORT_MSK __PWM_PAN159_PORT(0x03)
#define PWM_PAN159_PIN_MSK __PWM_PAN159_PIN(0x07)
#define PWM_PAN159_CHN_MSK __PWM_PAN159_CHN(0x07)
#define PWM_PAN159_PORT(PWMx) ((PWMx)>>6)
#define PWM_PAN159_PIN(PWMx) (((PWMx)&PWM_PAN159_PIN_MSK)>>3)
#define PWM_PAN159_CHN(PWMx) ((PWMx)&PWM_PAN159_CHN_MSK)
#define PWM_PAN159_CMPDAT ((volatile uint32_t*)(0x40040000+0x24))
#define PWM_PAN159_OEN (*(volatile uint32_t*)(0x40040000+0x5C))
#define PWM_PAN159_CHN_ISLOCKED(CHN_BITS) (PWM_PAN159_OEN&(CHN_BITS))
#define PWM_PAN159_CHN_LOCK(CHN_BITS) (PWM_PAN159_OEN&=~(CHN_BITS))
#define PWM_PAN159_CHN_UNLOCK(CHN_BITS) (PWM_PAN159_OEN|=(CHN_BITS))
#define PWM_PAN159_CHN_OUT(CHN,VAL) (PWM_PAN159_CMPDAT[(CHN)]=(VAL))
#define pwm_pan159_islocked(pwm_port) PWM_PAN159_CHN_ISLOCK(1<<PWM_PAN159_CHN((pwm_port)))
#define pwm_pan159_lock(pwm_port) PWM_PAN159_CHN_LOCK(1<<PWM_PAN159_CHN((pwm_port)))
#define pwm_pan159_unlock(pwm_port) PWM_PAN159_CHN_UNLOCK(1<<PWM_PAN159_CHN((pwm_port)))
#define pwm_pan159_out(pwm_port,val) PWM_PAN159_CHN_OUT(PWM_PAN159_CHN((pwm_port)),val)
//uint8_t pwm_pan159_init(uint8_t pwm_port,uint8_t psc,uint8_t div,uint32_t align,uint32_t cnt,uint8_t inv);
void pwm_pan159_init(uint8_t psc);
void pwm_pan159_setDuty(uint16_t *duty);
#ifdef __cplusplus
}
#endif
#endif // __LIB_DIRVER_PWM_PAN159_H
@@ -0,0 +1,70 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file drv_spi.c
* @brief SPI?y?ˉ
*
* @history - V1.0, 2017-03-06, xiaoguolin, first implementation.
*******************************************************************************/
#include "lib_driver_rfspi_pan159.h"
/*******************************************************************************
* @brief SPI初始化
* @param[in] 无
* @param[out] 无
* @return 无
******************************************************************************/
void rfspi_pan159_init(void)
{
SYS->P0_MFP |= SYS_MFP_P01_GPIO; // P01->RF_CSN
SYS->P0_MFP |= SYS_MFP_P07_SPI0_CLK|SYS_MFP_P05_SPI0_MOSI|SYS_MFP_P06_SPI0_MISO ;
SYS->P5_MFP |= SYS_MFP_P52_GPIO; //P20->RF_IRQ
CLK_EnableModuleClock(SPI0_MODULE);//使能SPI时钟
CLK_SetModuleClock(SPI0_MODULE,CLK_CLKSEL1_SPISEL_HCLK,1);//时钟1分频
GPIO_SetMode(P0, BIT1, GPIO_MODE_OUTPUT); //RF_CSN
GPIO_SetMode(P5, BIT2, GPIO_MODE_INPUT); //RF_IRQ
SYS->P0_MFP |= SYS_MFP_P05_SPI0_MOSI | SYS_MFP_P06_SPI0_MISO | SYS_MFP_P07_SPI0_CLK;//设置IO复用功能
SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0,8,2000000);//主设备,模式0,8位宽度,2M速率
SPI_DisableAutoSS(SPI0);//禁止硬件SS脚
SPI_WRITE_TX(SPI0, 0);//清除SPI数据
}
/*******************************************************************************
* @brief SPI字节读写
* @param[in] dat - 待写入数据
* @param[out] 无
* @return 读取到的字节
******************************************************************************/
uint8_t rfspi_pan159_rwc(uint8_t dat)
{
SPI_WRITE_TX(SPI0, dat);
SPI_TRIGGER(SPI0);
while(SPI_IS_BUSY(SPI0));
return SPI0->RX;
}
/*******************************************************************************
* @brief SPI读写数据块
* @param[in] p_dat - 数据指针
* len - 数据长度
* @param[out] 无
* @return 读取到的数据块,与p_dat共缓冲区
* @history - V1.0, 2017-03-06, xiaoguolin, first implementation.
******************************************************************************/
uint8_t* rfspi_pan159_rws(uint8_t* p_dat, uint16_t len)
{
uint8_t i = 0;
while(i < len)
{
SPI_WRITE_TX(SPI0, p_dat[i]);
SPI_TRIGGER(SPI0);
while(SPI_IS_BUSY(SPI0));
p_dat[i] = SPI0->RX;
i++;
}
return p_dat;
}
@@ -0,0 +1,36 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file drv_spi.h
* @brief SPIÇý¶¯
*
* @history - V1.0, 2017-03-06, xiaoguolin, first implementation.
*******************************************************************************/
#ifndef __DRV_SPI_H
#define __DRV_SPI_H
#ifdef __cplusplus
extern "C"{
#endif
#include "Mini58Series.h"
#define rfspi_pan159_irq() P52
#define rfspi_pan159_cs(level) (P01=(level))
void rfspi_pan159_init(void);
uint8_t rfspi_pan159_rwc(uint8_t dat);
uint8_t* rfspi_pan159_rws(uint8_t* p_dat, uint16_t len);
#define rfspi_ce(v) xn297l_write_reg(CE_FSPI_ON|(v), 0)
#define rfspi_irq rfspi_pan159_irq
#define rfspi_cs rfspi_pan159_cs
#define rfspi_init rfspi_pan159_init
#define rfspi_rwc rfspi_pan159_rwc
#define rfspi_rws rfspi_pan159_rws
#ifdef __cplusplus
}
#endif
#endif // __DRV_SPI_H
@@ -0,0 +1,379 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file driver_swiic_pan159.c
* @brief PAN159 GPIO IIC通用驱动
*
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
#include "lib_driver_swiic_pan159.h"
#include "string.h"
#define __swiic_pan159_delay __delay_pan159
#define __swiic_pan159_mutex_lock(hiic) __disable_irq()
#define __swiic_pan159_mutex_unlock(hiic) __enable_irq()
#define __swiic_pan159_read_sda(hiic) (*((hiic)->sda))
#define __swiic_pan159_write_sda(hiic,val) (*((hiic)->sda)=(val))
#define __swiic_pan159_write_scl(hiic,val) (*((hiic)->scl)=(val))
#define __swiic_pan159_set_speed(hiic,spd) ((hiic)->speed.code=(spd))
#define __swiic_pan159_get_speed(hiic) ((hiic)->speed.code)
//#define __swiic_pan159_echo_wclk(hiic) \
// do{ \
// __swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
// __swiic_pan159_write_scl((hiic),1); \
// __swiic_pan159_delay((hiic)->scl_tim_code_h); \
// __swiic_pan159_write_scl((hiic),0); \
// __swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
// }while(0)
void __swiic_pan159_echo_wclk(const swiic_pan159_t* hiic)
{
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
__swiic_pan159_write_scl(hiic,1);
__swiic_pan159_delay(hiic->speed.scl_tim_code.h);
__swiic_pan159_write_scl(hiic,0);
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
}
#define __swiic_pan159_echo_rclk(hiic,pret) \
do{ \
__swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
__swiic_pan159_write_scl((hiic),1); \
__swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
*(pret) = __swiic_pan159_read_sda((hiic)); \
__swiic_pan159_write_scl((hiic),0); \
__swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
}while(0)
/**
* IIC START SIGNAL:
* ___
* SDA \_______
* ______
* SCL / \___
*/
//#define __swiic_pan159_start(hiic) \
// do{ \
// __swiic_pan159_write_sda((hiic),1); \
// __swiic_pan159_write_scl((hiic),1); \
// __swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
// __swiic_pan159_write_sda((hiic),0); \
// __swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
// __swiic_pan159_write_scl((hiic),0); \
// __swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
// }while(0)
void __swiic_pan159_start(const swiic_pan159_t* hiic)
{
__swiic_pan159_write_sda(hiic,1);
__swiic_pan159_write_scl(hiic,1);
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
__swiic_pan159_write_sda(hiic,0);
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
__swiic_pan159_write_scl(hiic,0);
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
}
/**
* IIC STOP SIGNAL:
* ___
* SDA ___/
* ______
* SCL /
*/
//#define __swiic_pan159_stop(hiic) \
// do{ \
// __swiic_pan159_write_sda((hiic),0); \
// __swiic_pan159_write_scl((hiic),1); \
// __swiic_pan159_delay((hiic)->scl_tim_code_l); \
// __swiic_pan159_write_sda((hiic),1); \
// }while(0)
void __swiic_pan159_stop(const swiic_pan159_t* hiic)
{
__swiic_pan159_write_sda(hiic,0);
__swiic_pan159_write_scl(hiic,1);
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
__swiic_pan159_write_sda(hiic,1);
}
/**
* IIC ACK SIGNAL:
* _
* SDA \___________/
* ____
* SCL ___/ \_____
*/
#define __swiic_pan159_write_ack(hiic) \
do{ \
__swiic_pan159_write_sda((hiic),0); \
__swiic_pan159_echo_wclk((hiic)); \
__swiic_pan159_write_sda((hiic),1); \
}while(0)
/**
* IIC NACK SIGNAL:
* ____________
* SDA
* ____
* SCL ___/ \___
*/
#define __swiic_pan159_write_nack(hiic) \
do{ \
__swiic_pan159_write_sda((hiic),1); \
__swiic_pan159_echo_wclk((hiic)); \
}while(0)
void __swiic_pan159_write_byte(const swiic_pan159_t *hiic, uint8_t _ubyte)
{
register uint8_t ubyte = _ubyte;
register uint8_t i;
for(i = 0; i < 8; i++){
__swiic_pan159_write_sda(hiic,((ubyte & 0x80) ? 1 : 0));
__swiic_pan159_echo_wclk(hiic);
ubyte <<= 1;
}
}
uint8_t __swiic_pan159_read_byte(const swiic_pan159_t* hiic)
{
register uint8_t ubyte = 0;
register uint8_t i;
for(i = 0; i < 8; i++){
ubyte <<= 1;
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
__swiic_pan159_write_scl(hiic,1);
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
ubyte |= __swiic_pan159_read_sda(hiic);
__swiic_pan159_write_scl(hiic,0);
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
}
return ubyte;
}
uint8_t __swiic_pan159_read_ack(const swiic_pan159_t* hiic)
{
uint8_t ret;
__swiic_pan159_write_sda(hiic,1);
__swiic_pan159_echo_rclk(hiic,&ret);
return ret;
}
/*******************************************************************************
* @brief GPIO IIC初始化
* @param[in] hiic - IIC设备句柄
* iic_speed - IIC速率
* sda_port_n - SDA端口号
* sda_pin_n - SDA引脚号
* scl_port_n - SCL端口号
* scl_pin_n - SCL引脚号
* @return 1 - 成功, 0 - 失败
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
void swiic_pan159_init(swiic_pan159_t* hiic, uint32_t iic_speed,
uint32_t sda_port_n, uint32_t sda_pin_n,
uint32_t scl_port_n, uint32_t scl_pin_n)
{
hiic->sda = &GPIO_PIN_ADDR(sda_port_n,sda_pin_n);
hiic->scl = &GPIO_PIN_ADDR(scl_port_n,scl_pin_n);
/**
* us * 6 - 4 = code
* 时钟分布为 low : high = 2 : 1, 因此分为 3 份
* ______
* \______ ______/ \
* low - 2 high - 1
* 因此code = us * 2 - 1
*/
__swiic_pan159_set_speed(hiic, iic_speed);
#define __PORT__(n) ((GPIO_T *) (AHBPERIPH_BASE + (0x04000 | ((n) << 6))))
#define __PIN__(n) (1 << (n))
GPIO_SetMode(__PORT__(sda_port_n),__PIN__(sda_pin_n),GPIO_MODE_OPEN_DRAIN);
GPIO_SetMode(__PORT__(scl_port_n),__PIN__(scl_pin_n),GPIO_MODE_OPEN_DRAIN);
#undef __PORT__
#undef __PIN__
__swiic_pan159_stop(hiic);
}
/*******************************************************************************
* @brief GPIO IIC读取(该函数读取具有一定的风险,无法区分读取失败和读到0)
* @param[in] dhiic - 目标IIC设备句柄
* shiic - 源IIC设备句柄
* iic_speed - IIC速率
* @return 无
* @history - V1.0, 2017-09-12, xiaoguolin, first implementation.
*******************************************************************************/
void swiic_pan159_copy(swiic_pan159_t* dhiic, const swiic_pan159_t* shiic, uint32_t iic_speed)
{
memcpy(dhiic,shiic,sizeof(swiic_pan159_t));
if(iic_speed != SWIIC_PAN159_SPEED_SYS_48M_IIC_DEFAULT){
__swiic_pan159_set_speed(dhiic,iic_speed);
}
}
/*******************************************************************************
* @brief GPIO IIC读取(该函数读取具有一定的风险,无法区分读取失败和读到0)
* @param[in] hiic - IIC设备句柄
* iic_speed - IIC速率
* dev - IIC设备地址
* reg - 寄存器地址
* @return 读取到的字节
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
uint8_t swiic_pan159_read_byte(const swiic_pan159_t* hiic, uint8_t dev, uint8_t reg)
{
register uint8_t ret = 0;
__swiic_pan159_mutex_lock(hiic); /* 锁定MUTEX */
__swiic_pan159_start(hiic); /* 启动IIC */
__swiic_pan159_write_byte(hiic,(dev << 1)|0); /* 写设备地址(写) */
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
__swiic_pan159_write_byte(hiic,reg); /* 写寄存器地址 */
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
__swiic_pan159_start(hiic); /* 重启IIC */
__swiic_pan159_write_byte(hiic,(dev << 1)|1); /* 写设备地址(读) */
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
ret = __swiic_pan159_read_byte(hiic); /* 读取数据字节 */
__swiic_pan159_write_nack(hiic); /* 回写NACK */
} /* */
} /* */
} /* */
__swiic_pan159_stop(hiic); /* 停止IIC */
__swiic_pan159_mutex_unlock(hiic); /* 释放MUTEX */
return ret;
}
/*******************************************************************************
* @brief GPIO IIC读取
* @param[in] hiic - IIC设备句柄
* iic_speed - IIC速率
* dev - IIC设备地址
* reg - 寄存器地址
* len - 要读取的数据长度
* @param[out] _buf - 数据缓冲区
* @return 读取到的字节数
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
uint32_t swiic_pan159_read_bytes(const swiic_pan159_t* hiic, uint8_t dev, uint8_t reg, uint8_t* buf, uint32_t len)
{
register uint32_t i = 0;
__swiic_pan159_mutex_lock(hiic); /* 锁定MUTEX */
__swiic_pan159_start(hiic); /* 启动IIC */
__swiic_pan159_write_byte(hiic,(dev << 1)|0); /* 写设备地址(写) */
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
__swiic_pan159_write_byte(hiic,reg); /* 写寄存器地址 */
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
__swiic_pan159_start(hiic); /* 重启IIC */
__swiic_pan159_write_byte(hiic,(dev << 1)|1); /* 写设备地址(读) */
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
for(len--; i < len; i++){ /* len中减掉读取数据中的最后一个字节 */
buf[i] = __swiic_pan159_read_byte(hiic); /* 读取字节 */
__swiic_pan159_write_ack(hiic); /* 回写ACK */
} /* */
buf[i++] = __swiic_pan159_read_byte(hiic); /* 读取最后一个字节 */
__swiic_pan159_write_nack(hiic); /* 回写NACK */
} /* */
} /* */
} /* */
__swiic_pan159_stop(hiic); /* 停止IIC */
__swiic_pan159_mutex_unlock(hiic); /* 释放MUTEX */
return i;
}
/*******************************************************************************
* @brief GPIO IIC写入
* @param[in] hiic - IIC设备句柄
* iic_speed - IIC速率
* dev - IIC设备地址
* reg - 寄存器地址
* ubyte - 待写入字节
* @return 1 - 成功
* 0 - 失败
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
uint8_t swiic_pan159_write_byte(const swiic_pan159_t* hiic, uint8_t dev, uint8_t reg, uint8_t ubyte)
{
__swiic_pan159_mutex_lock(hiic); /* 锁定MUTEX */
__swiic_pan159_start(hiic); /* 启动IIC */
__swiic_pan159_write_byte(hiic,(dev << 1)|0); /* 写设备地址(写) */
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
__swiic_pan159_write_byte(hiic,reg); /* 写寄存器地址 */
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
__swiic_pan159_write_byte(hiic,ubyte); /* 写字节数据 */
ubyte = (__swiic_pan159_read_ack(hiic) == 0) ? 1 : 0; /* 读取ACK */
} /* */
} /* */
__swiic_pan159_stop(hiic); /* 停止IIC */
__swiic_pan159_mutex_unlock(hiic); /* 释放MUTEX */
return ubyte;
}
/*******************************************************************************
* @brief GPIO IIC写入
* @param[in] hiic - IIC设备句柄
* iic_speed - IIC速率
* dev - IIC设备地址
* reg - 寄存器地址
* buf - 数据缓冲区
* len - 要写入的数据长度
* @return 写入的字节数
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
uint32_t swiic_pan159_write_bytes(const swiic_pan159_t* hiic, uint8_t dev, uint8_t reg, const uint8_t* buf, uint32_t len)
{
register uint32_t i = 0;
__swiic_pan159_mutex_lock(hiic); /* 锁定MUTEX */
__swiic_pan159_start(hiic); /* 启动IIC */
__swiic_pan159_write_byte(hiic,(dev << 1)|0); /* 写设备地址(写) */
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
__swiic_pan159_write_byte(hiic,reg); /* 写寄存器地址 */
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
for(; i < len; i++){ /* */
__swiic_pan159_write_byte(hiic,buf[i]); /* 写字节数据 */
if(__swiic_pan159_read_ack(hiic) != 0){ /* 读取ACK */
break; /* */
} /* */
} /* */
} /* */
} /* */
__swiic_pan159_stop(hiic); /* 停止IIC */
__swiic_pan159_mutex_unlock(hiic); /* 释放MUTEX */
return i;
}
swiic_pan159_t imu_iic;
swiic_pan159_t bar_iic;
//typedef void (*TCallback)(void);
void iic_pan159_init(void)
{
swiic_pan159_init(&imu_iic,0x00030003,3,4,3,5);
swiic_pan159_copy(&bar_iic,&imu_iic,0x00030003);
}
void iic_start_send_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk)
{
if(swiic_pan159_write_bytes(&imu_iic, devAddr, regAddr, buf, len)){
if(cbk){
cbk();
}
}
else{
if(fail_cbk){
fail_cbk();
}
}
}
void iic_start_read_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk)
{
if(swiic_pan159_read_bytes(&imu_iic, devAddr, regAddr, buf, len)){
if(cbk){
cbk();
}
}
else{
if(fail_cbk){
fail_cbk();
}
}
}
@@ -0,0 +1,178 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file driver_swiic_pan159.h
* @brief PAN159 GPIO IIC通用驱动
*
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
#ifndef __DRIVER_SWIIC_PAN159_H
#define __DRIVER_SWIIC_PAN159_H
#ifdef __cplusplus
extern "C"{
#endif
#include "lib_driver_delay_pan159.h"
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_578K 0x00000000
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_540K 0x00010000
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_515K 0x00020000
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_476K 0x00010001
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_457K 0x00020001
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_426K 0x00020002
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_412K 0x00030002
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_397K 0x00040002
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_385K 0x00030003
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_373K 0x00040003
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_361K 0x00050003
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_351K 0x00060003
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_341K 0x00050004
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_331K 0x00060004
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_322K 0x00070004
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_313K 0x00060005
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_306K 0x00070005
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_298K 0x00080005
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_291K 0x00090005
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_284K 0x00080006
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_278K 0x00090006
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_271K 0x000A0006
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_265K 0x000B0006
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_259K 0x000C0006
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_254K 0x000D0006
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_249K 0x000C0007
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_244K 0x000D0007
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_239K 0x000E0007
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_234K 0x000F0007
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_230K 0x000E0008
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_225K 0x000F0008
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_220K 0x00100008
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_215K 0x00110008
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_200K 0x0010000B
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_190K 0x0011000C
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_181K 0x0010000E
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_171K 0x00100010
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_161K 0x00140010
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_151K 0x00190010
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_141K 0x001E0010
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_129K 0x001E0014
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_119K 0x001E0018
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_108K 0x001E001D
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_100K 0x00220020
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_81K 0x00380023
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_69K 0x00480028
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_54K 0x00580038
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_42K 0x00690050
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_31K 0x00880070
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_20K 0x010000A0
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_10K 0x02000160
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_1K 0x0FFF0F69
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_750 0x1A01123B
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_500 0x20001EDD
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_200 0x60004539
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_FASTEST 0x00000000
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_DEFAULT 0xFFFFFFFF
typedef struct{
volatile uint32_t *sda;
volatile uint32_t *scl;
union{
uint32_t code;
struct{
uint16_t l;
uint16_t h;
}scl_tim_code;
}speed;
}swiic_pan159_t;
/*******************************************************************************
* @brief GPIO IIC初始化
* @param[in] hiic - IIC设备句柄
* iic_speed - IIC速率
* sda_port_n - SDA端口号
* sda_pin_n - SDA引脚号
* scl_port_n - SCL端口号
* scl_pin_n - SCL引脚号
* @return 无
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
void swiic_pan159_init(swiic_pan159_t* hiic, uint32_t iic_speed,
uint32_t sda_port_n, uint32_t sda_pin_n,
uint32_t scl_port_n, uint32_t scl_pin_n);
/*******************************************************************************
* @brief GPIO IIC读取(该函数读取具有一定的风险,无法区分读取失败和读到0)
* @param[in] dhiic - 目标IIC设备句柄
* shiic - 源IIC设备句柄
* iic_speed - IIC速率
* @return 无
* @history - V1.0, 2017-09-12, xiaoguolin, first implementation.
*******************************************************************************/
void swiic_pan159_copy(swiic_pan159_t* dhiic, const swiic_pan159_t* shiic,
uint32_t iic_speed);
/*******************************************************************************
* @brief GPIO IIC读取(该函数读取具有一定的风险,无法区分读取失败和读到0)
* @param[in] hiic - IIC设备句柄
* dev - IIC设备地址
* reg - 寄存器地址
* @return 读取到的字节
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
uint8_t swiic_pan159_read_byte(const swiic_pan159_t* hiic,
uint8_t dev, uint8_t reg);
/*******************************************************************************
* @brief GPIO IIC读取
* @param[in] hiic - IIC设备句柄
* dev - IIC设备地址
* reg - 寄存器地址
* len - 要读取的数据长度
* @param[out] _buf - 数据缓冲区
* @return 读取到的字节数
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
uint32_t swiic_pan159_read_bytes(const swiic_pan159_t* hiic,
uint8_t dev, uint8_t reg,
uint8_t* buf, uint32_t len);
/*******************************************************************************
* @brief GPIO IIC写入
* @param[in] hiic - IIC设备句柄
* dev - IIC设备地址
* reg - 寄存器地址
* ubyte - 待写入字节
* @return 1 - 成功
* 0 - 失败
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
uint8_t swiic_pan159_write_byte(const swiic_pan159_t* hiic,
uint8_t dev, uint8_t reg, uint8_t ubyte);
/*******************************************************************************
* @brief GPIO IIC写入
* @param[in] hiic - IIC设备句柄
* dev - IIC设备地址
* reg - 寄存器地址
* buf - 数据缓冲区
* len - 要写入的数据长度
* @return 写入的字节数
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
*******************************************************************************/
uint32_t swiic_pan159_write_bytes(const swiic_pan159_t* hiic,
uint8_t dev, uint8_t reg,
const uint8_t* buf, uint32_t len);
typedef void (*TCallback)(void);
void iic_pan159_init(void);
void iic_start_send_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk);
void iic_start_read_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk);
#ifdef __cplusplus
}
#endif
#endif /* __DRIVER_SWIIC_PAN159_H */
@@ -0,0 +1,105 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_timer_pan159.c
* @brief 定时器
*
* @history - V1.0, 2017-11-16, xiaoguolin, first implementation.
*******************************************************************************/
#include "lib_driver_timer_pan159.h"
static void (*__s_lib_driver_timer_pan159_irq_handler)(void) = NULL;
static void (*__s_lib_driver_timer1_pan159_irq_handler)(void) = NULL;
/*******************************************************************************
* @brief 定时器0初始化
* @param[in] 无
* @param[out] 无
* @return 无
* @history - V1.0, 2017-03-07, xiaoguolin, first implementation.
******************************************************************************/
void timer_pan159_init(uint32_t freq, void(*irq_handler)(void))
{
CLK_EnableModuleClock(TMR0_MODULE);
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, freq);
// Enable timer interrupt
if(irq_handler){
TIMER_EnableInt(TIMER0);
NVIC_EnableIRQ(TMR0_IRQn);
NVIC_SetPriority(TMR0_IRQn,2);
}
__s_lib_driver_timer_pan159_irq_handler = irq_handler;
// Start Timer 0.
TIMER_Start(TIMER0);
}
/*******************************************************************************
* @brief 定时器0中断处理函数
* @param[in] 无
* @param[out] 无
* @return 无
* @history - V1.0, 2017-03-07, xiaoguolin, first implementation.
******************************************************************************/
void TMR0_IRQHandler(void)
{
TIMER_ClearIntFlag(TIMER0);
if(__s_lib_driver_timer_pan159_irq_handler){
__s_lib_driver_timer_pan159_irq_handler();
}
}
/*******************************************************************************
* @brief 定时1初始化
* @param[in] 无
* @param[out] 无
* @return 无
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
******************************************************************************/
void timer1_pan159_init(uint32_t freq, void(*irq_handler)(void))
{
CLK_EnableModuleClock(TMR1_MODULE);
TIMER_Open(TIMER1, TIMER_PERIODIC_MODE, freq);
// Enable timer interrupt
if(irq_handler){
TIMER_EnableInt(TIMER1);
NVIC_EnableIRQ(TMR1_IRQn);
NVIC_SetPriority(TMR1_IRQn,2);
}
__s_lib_driver_timer1_pan159_irq_handler = irq_handler;
// Start Timer 0.
TIMER_Start(TIMER1);
}
/*******************************************************************************
* @brief 定时器1中断处理函数
* @param[in] 无
* @param[out] 无
* @return 无
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
******************************************************************************/
void TMR1_IRQHandler(void)
{
TIMER_ClearIntFlag(TIMER1);
if(__s_lib_driver_timer1_pan159_irq_handler){
__s_lib_driver_timer1_pan159_irq_handler();
}
}
void DrvTimer0_SetTimer(uint32_t usec)
{
TIMER_Close(TIMER0);
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, usec);
TIMER_EnableInt(TIMER0);
//NVIC_EnableIRQ(TMR0_IRQn);
//NVIC_SetPriority(TMR0_IRQn,2);
TIMER_Start(TIMER0);
}
void DrvTimer1_SetTimer(uint32_t usec)
{
TIMER_Close(TIMER1);
TIMER_Open(TIMER1, TIMER_PERIODIC_MODE, usec);
TIMER_EnableInt(TIMER1);
//NVIC_EnableIRQ(TMR1_IRQn);
//NVIC_SetPriority(TMR1_IRQn,2);
TIMER_Start(TIMER1);
}
@@ -0,0 +1,27 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_timer_pan159.c
* @brief ¶¨Ê±Æ÷
*
* @history - V1.0, 2017-11-16, xiaoguolin, first implementation.
*******************************************************************************/
#ifndef __LIB_DRIVER_TIMER_PAN159_H
#define __LIB_DRIVER_TIMER_PAN159_H
#ifdef __cplusplus
extern "C"{
#endif
#include "Mini58Series.h"
void timer_pan159_init(uint32_t freq, void(*irq_handler)(void));
void timer1_pan159_init(uint32_t freq, void(*irq_handler)(void));
void DrvTimer0_SetTimer(uint32_t usec);
void DrvTimer1_SetTimer(uint32_t usec);
#ifdef __cplusplus
}
#endif
#endif //__LIB_DRIVER_TIMER_PAN159_H
@@ -0,0 +1,69 @@
/*******************************************************************************
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_uart_pan159.c
* @brief PAN159 hardware uartÇý¶¯
*
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
*******************************************************************************/
#include "lib_driver_uart_pan159.h"
#include "string.h"
uint8_t uartRcvBuffer[RX_BUF_SIZE],wptr,u8InChar,uartTxBuffer[TX_BUF_SIZE];
uint16_t u16Count;
uint16_t u16TxDataLen;
/*---------------------------------------------------------------------------------------------------------*/
/* ISR to handle UART Channel 0 interrupt event */
/*---------------------------------------------------------------------------------------------------------*/
void UART0_IRQHandler(void)
{
uint32_t u32IntSts= UART0->INTSTS;
if(u32IntSts & UART_INTSTS_RDAINT_Msk) {
/* Get all the input characters */
while(UART_IS_RX_READY(UART0)) {
/* Get the character from UART Buffer */
if(wptr < RX_BUF_SIZE) {
uartRcvBuffer[wptr++] = UART_READ(UART0);
}
else{
wptr = 0;
uartRcvBuffer[wptr] = UART_READ(UART0);
}
}
}
if(u32IntSts & UART_INTSTS_THREINT_Msk) {
if(u16Count < u16TxDataLen && u16TxDataLen != 0){
u8InChar = uartTxBuffer[u16Count++];
UART_WRITE(UART0,u8InChar);
if(u16Count >= u16TxDataLen){
u16TxDataLen = 0;
u16Count = 0;
UART_DISABLE_INT(UART0,UART_INTEN_THREIEN_Msk);
}
}
}
}
void uart_init_pan159(void)
{
CLK_EnableModuleClock(UART0_MODULE);
// SYS->P4_MFP = SYS_MFP_P46_UART1_RXD | SYS_MFP_P47_UART1_TXD;
SYS->P5_MFP = SYS_MFP_P51_UART0_RXD | SYS_MFP_P50_UART0_TXD;
GPIO_ENABLE_DIGITAL_PATH(P5,(1<<1));
// UART_Open(UART1, 115200);
UART_Open(UART0, 115200);
UART_ENABLE_INT(UART0, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk /*| UART_INTEN_THREIEN_Msk*/));
NVIC_EnableIRQ(UART0_IRQn);
}
void uart_send(uint8_t *buff,uint16_t len)
{
u16TxDataLen = len;
u16Count = 0;
memcpy(&uartTxBuffer[0],&buff[0],len);
UART_ENABLE_INT(UART0,UART_INTEN_THREIEN_Msk);
}
@@ -0,0 +1,27 @@
/*******************************************************************************
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_uart_pan159.c
* @brief PAN159 hardware uartÇý¶¯
*
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
*******************************************************************************/
#ifndef __LIB_DIRVER_UART_PAN159_H
#define __LIB_DIRVER_UART_PAN159_H
#ifdef __cplusplus
extern "C"{
#endif
#include "Mini58Series.h"
#define RX_BUF_SIZE 32
#define TX_BUF_SIZE 32
//#define DEBUG_PORT UART1
void uart_init_pan159(void);
void uart_send(uint8_t *buff,uint16_t len);
#ifdef __cplusplus
}
#endif
#endif // __LIB_DIRVER_UART_PAN159_H
@@ -0,0 +1,44 @@
/*******************************************************************************
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_wdt_pan159.c
* @brief PAN159 hardware wdtÇý¶¯
*
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
*******************************************************************************/
#include "lib_driver_wdt_pan159.h"
/**
* @brief This function make WDT module start counting with different time-out interval
* @param[in] u32TimeoutInterval Time-out interval period of WDT module. Valid values are:
* - \ref WDT_TIMEOUT_2POW4 -- 1.6MS
* - \ref WDT_TIMEOUT_2POW6 -- 6.4MS
* - \ref WDT_TIMEOUT_2POW8 -- 25.6MS
* - \ref WDT_TIMEOUT_2POW10 -- 102.4MS
* - \ref WDT_TIMEOUT_2POW12 -- 409.6MS
* - \ref WDT_TIMEOUT_2POW14 -- 1.6384S
* - \ref WDT_TIMEOUT_2POW16 -- 6.5536S
* - \ref WDT_TIMEOUT_2POW18 -- 26.214S
*/
void DrvWDT_Init(uint32_t u32TimeoutInterval)
{
SYS_UnlockReg();
CLK->CLKSEL1 |= 0x00000003;
SystemCoreClockUpdate();
WDT->CTL = u32TimeoutInterval | WDT_CTL_WDTEN_Msk |
(TRUE << WDT_CTL_RSTEN_Pos) |
(FALSE << WDT_CTL_WKEN_Pos);
WDT->ALTCTL = WDT_RESET_DELAY_3CLK;
}
void DrvWDT_Feed(void)
{
WDT_RESET_COUNTER();
}
void DrvWDT_close(void)
{
WDT->CTL = 0;
}
@@ -0,0 +1,26 @@
/*******************************************************************************
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file lib_driver_wdt_pan159.c
* @brief PAN159 hardware wdtÇý¶¯
*
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
*******************************************************************************/
#ifndef __LIB_DIRVER_WDT_PAN159_H
#define __LIB_DIRVER_WDT_PAN159_H
#ifdef __cplusplus
extern "C"{
#endif
#include "Mini58Series.h"
void DrvWDT_Init(uint32_t ms);
void DrvWDT_Feed(void);
void DrvWDT_close(void);
#ifdef __cplusplus
}
#endif
#endif // __LIB_DIRVER_WDT_PAN159_H
@@ -0,0 +1,289 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file drv_xn297l.c
* @brief XN297L RF驱动
*
* @history - V1.0, 2017-03-06, xiaoguolin, first implementation.
*******************************************************************************/
#include "lib_driver_xn297l.h"
/******************************************************************************/
//void rf_write_reg(uint8_t reg,uint8_t data);
//rf写寄存器函数
//input:uint8_t reg,寄存器地址;uint8_t data:需要写入寄存器的值
//output:无
/******************************************************************************/
void xn297l_write_reg(uint8_t reg,uint8_t data)
{
rfspi_cs(0); //使能片选
rfspi_rwc(reg); //写入的寄存器的地址
rfspi_rwc(data); //写入的寄存器的值
rfspi_cs(1); //禁能片选
}
/******************************************************************************/
//uint8_t rf_read_reg(uint8_t reg);
//rf读寄存器函数
//input:uint8_t reg,需要读取的寄存器
//output:寄存器的值
/******************************************************************************/
uint8_t xn297l_read_reg(uint8_t reg)
{
uint8_t tmp;
rfspi_cs(0); //使能片选
rfspi_rwc(reg); //写入的寄存器的地址
tmp = rfspi_rwc(0x00); //读取寄存器的值
rfspi_cs(1); //禁能片选
return tmp;
}
/******************************************************************************/
//void rf_write_buf(uint8_t reg,uint8_t *pbuf,uint8_t length);
//rf写缓冲函数
//input:uint8_t reg,写入寄存器的地址;uint8_t *pbuf,写入数组的首地址;uint8_t length,写入数据的长度
//output:无
/******************************************************************************/
void xn297l_write_buf(uint8_t reg,uint8_t *pbuf,uint8_t length)
{
uint8_t i;
rfspi_cs(0); //使能片选
rfspi_rwc(reg);
for(i = 0;i < length; i++)
{
rfspi_rwc(pbuf[i]); //写入数据
}
rfspi_cs(1); //禁能片选
}
/******************************************************************************/
//void rf_read_buf(uint8_t reg,uint8_t *pbuf,uint8_t length);
//rf读缓冲函数
//input:uint8_t reg,读出寄存器的地址;uint8_t *pbuf,读出缓冲数组的首地址;uint8_t length,读出数据的长度
//output:无
/******************************************************************************/
void xn297l_read_buf(uint8_t reg, uint8_t *pbuf, uint8_t length)
{
uint8_t i;
rfspi_cs(0); //使能片选
rfspi_rwc(reg);
for(i = 0; i < length; i++)
{
pbuf[i] = rfspi_rwc(0x00); //读取数据
}
rfspi_cs(1); //禁能片选
}
/******************************************************************************/
//void rf_tx_mode(void);
//XN297L设置为发送模式
//input:无
//output:无
/******************************************************************************/
void xn297l_tx_mode(void)
{
// uint8_t rf_cal_data[] = {0xF6,0x37,0x5D};
// rf_write_buf(W_REGISTER + RF_CAL,rf_cal_data, sizeof(rf_cal_data));//设置RF_CAL
xn297l_write_reg(W_REGISTER + CONFIG,0x8E); // rf设置为发送模式
clear_CE();
delay_us(20);
}
/******************************************************************************/
//void rf_rx_mode(void);
//XN297L设置为接收模式
//input:无
//output:无
/******************************************************************************/
void xn297l_rx_mode(void)
{
// uint8_t rf_cal_data[] = {0x06,0x37,0x5D};
// rf_write_buf(W_REGISTER + RF_CAL,rf_cal_data, sizeof(rf_cal_data));//设置RF_CAL
xn297l_write_reg(W_REGISTER + CONFIG,0X8F); // rf设置为接收模式
set_CE();
//delay_ms(1);
}
/******************************************************************************/
//void rf_get_status(void);
//XN297L获取状态信息
//input:无
//output:状态寄存器的值
/******************************************************************************/
uint8_t xn297l_get_status(void)
{
return xn297l_read_reg(RF_STATUS)&0x70; //读取状态值
}
/******************************************************************************/
//void rf_clear_status(void);
//XN297L清除状态信息
//input:无
//output:无
/******************************************************************************/
void xn297l_clear_status(void)
{
xn297l_write_reg(W_REGISTER + RF_STATUS,0x70);
}
/******************************************************************************/
//void rf_clear_FIFO(void);
//XN297L清除缓冲
//input:无
//output:无
/******************************************************************************/
void xn297l_clear_fifo(void)
{
xn297l_write_reg(FLUSH_TX, 0); //清除发送缓冲
xn297l_write_reg(FLUSH_RX, 0); //清除接收缓冲
}
/******************************************************************************/
//void rf_set_channel(uint8_t channel);
//XN297L设置通信信道
//input:uint8_t channel,设置的通信信道
//output:无
/******************************************************************************/
void xn297l_set_channel(uint8_t channel)
{
// current_channel = channel;
xn297l_write_reg(W_REGISTER + RF_CH, channel);
}
/******************************************************************************/
//void rf_set_addr(uint8_t reg,uint8_t *rf_addr_array);
//XN297L设置通信地址
//input:uint8_t reg,需要设置的寄存器,uint8_t *rf_addr_array,设置的地址
//output:无
/******************************************************************************/
void xn297l_set_addr(uint8_t reg,uint8_t *rf_addr_array,uint8_t addr_len)
{
xn297l_write_buf(W_REGISTER + reg,rf_addr_array, addr_len);//设置地址
}
/******************************************************************************/
//uint8_t rf_tx_data(uint8_t *data, uint8_t length);
//XN297L发送数据
//input:uint8_t *data,发送数据数组的首地址;uint8_t length发送数据的长度
//output:发送状态值
/******************************************************************************/
void xn297l_tx_data(uint8_t *data, uint8_t length)
{
set_CE();
delay_us(100);
xn297l_write_buf(W_TX_PAYLOAD,data,length); //发送数据
while(IRQ_STATUS);
xn297l_clear_status(); //清除状态
xn297l_write_reg(FLUSH_TX,0); //清除发送缓冲
clear_CE();
}
/******************************************************************************/
//uint8_t rf_rx_data(uint8_t *data,uint8_t length);
//rf接收函数
//input:uint8_t *data,接收数据数组首地址;uint8_t length:接收数据的长度
//output:接收正确与否标志
/******************************************************************************/
uint8_t xn297l_rx_data(uint8_t *data,uint8_t length)
{
if(IRQ_STATUS)
{
return 0; //等待接收
}
xn297l_read_buf(R_RX_PAYLOAD,data,length); //接收数据
xn297l_write_reg(FLUSH_RX,0); //清除接收缓冲
xn297l_clear_status(); //清除状态
return 1;
}
/******************************************************************************/
//void rf_init(void);
//rf初始化函数,执行一些初始化操作
//input:无
//output:无
/******************************************************************************/
void rf_init(void)
{
uint8_t addr[] = {0x23,0x23,0x23};
rfspi_init();
xn297l_init(addr,3,20,13,XN297L_RF_POWER_P_5|XN297L_RF_DATA_RATE_1M);
xn297l_rx_mode();
}
void xn297l_init(uint8_t* addr,uint8_t addr_len,uint8_t chn,uint8_t payload,uint8_t rate_power)
{
#if ((DATA_RATE==DR_1M) || (DATA_RATE==DR_2M))
uint8_t BB_cal_data[] = {0x12,0xED,0x67,0x9C,0x46};
uint8_t rf_cal_data[] = {0xF6,0x3F,0x5D};
uint8_t rf_cal2_data[] = {0x45,0x21,0xEF,0x2C,0x5A,0x40};
uint8_t Dem_cal_data[] = {0x01};
uint8_t Dem_cal2_data[] = {0x0B,0xDF,0x02};
#elif (DATA_RATE==DR_250K)
uint8_t BB_cal_data[] = {0x12,0xEC,0x6F,0xA1,0x46};
uint8_t rf_cal_data[] = {0xF6,0x3F,0x5D};
uint8_t rf_cal2_data[] = {0xD5,0x21,0xEB,0x2C,0x5A,0x40};
uint8_t Dem_cal_data[] = {0x1F};
uint8_t Dem_cal2_data[] = {0x0B,0xDF,0x02};
#endif
xn297l_write_reg(RST_FSPI,0x5A); //芯片软复位
xn297l_write_reg(RST_FSPI,0XA5);
delay_ms(1);
xn297l_clear_fifo();//清除缓冲
xn297l_clear_status(); //清除状态寄存器
if(payload < 33)
{
#if(CE_TYPE==CE_HARDWARE_MODE)
xn297l_write_reg(W_REGISTER +FEATURE, 0x00); //32字节数据,使能硬件CE
#else
xn297l_write_reg(W_REGISTER +FEATURE, 0x20); //32字节数据,使能软件CE
#endif
}
else
{
#if(CE_TYPE==CE_HARDWARE_MODE)
xn297l_write_reg(W_REGISTER +FEATURE, 0x18); //64字节数据,使能硬件CE
#else
xn297l_write_reg(W_REGISTER +FEATURE, 0x38); //64字节数据,使能软件CE
#endif
}
clear_CE();
xn297l_write_reg(W_REGISTER + EN_RXADDR,0x03); //使能接收通道0通道1
xn297l_write_reg(W_REGISTER + SETUP_AW,addr_len-2); //[1-3] = [3-5]
xn297l_write_reg(W_REGISTER + RF_CH,chn); //设置接收信道
xn297l_write_reg(W_REGISTER + RX_PW_P0,payload); //设置接收数据宽度,即Payload宽度
xn297l_write_reg(W_REGISTER + RX_PW_P1,payload); //设置接收数据宽度,即Payload宽度
xn297l_write_buf(W_REGISTER + TX_ADDR,addr, addr_len); //设置发送地址
xn297l_write_buf(W_REGISTER + RX_ADDR_P0,addr, addr_len); //设置接收地址
xn297l_write_buf(W_REGISTER + BB_CAL,BB_cal_data, sizeof(BB_cal_data)); //设置BB_CAL
xn297l_write_buf(W_REGISTER + RF_CAL2,rf_cal2_data, sizeof(rf_cal2_data)); //设置RF_CAL2
xn297l_write_buf(W_REGISTER + DEM_CAL,Dem_cal_data, sizeof(Dem_cal_data)); //设置DEM_CAL
xn297l_write_buf(W_REGISTER + RF_CAL,rf_cal_data, sizeof(rf_cal_data)); //设置RF_CAL
xn297l_write_buf(W_REGISTER + DEM_CAL2,Dem_cal2_data,sizeof(Dem_cal2_data));//设置DEM_CAL2
xn297l_write_reg(W_REGISTER + DYNPD, 0x00); //禁止动态Payload
xn297l_write_reg(W_REGISTER + RF_SETUP,rate_power); //设置发射功率和速率
#if(TRANSMIT_TYPE == TRANS_ENHANCE_MODE) //设置为增强模式
xn297l_write_reg(W_REGISTER + SETUP_RETR,0x03); //使能三次重发
xn297l_write_reg(W_REGISTER + EN_AA, 0x01); //使能自动应答
#elif(TRANSMIT_TYPE == TRANS_NORMAL_MODE) //设置为普通模式
xn297l_write_reg(W_REGISTER + SETUP_RETR,0x00); //禁止重发
xn297l_write_reg(W_REGISTER + EN_AA, 0x00); //禁止自动应答
#endif
}
/******************************************************************************/
//单载波模式
/******************************************************************************/
void RF_Carrier( uint8_t ucChannel_Set)
{
uint8_t BB_cal_data[] = {0x0A,0x6D,0x67,0x9C,0x46};
uint8_t RF_cal_data[] = {0xF6,0x37,0x5D};
uint8_t RF_cal2_data[] = {0x45,0x21,0xEF,0xAC,0x5A,0x50};
uint8_t Dem_cal_data[] = {0xE1};
uint8_t Dem_cal2_data[] = {0x0B,0xDF,0x02};
xn297l_write_reg(W_REGISTER + RF_CH,ucChannel_Set);
xn297l_write_reg(W_REGISTER + RF_SETUP, 0x3F); //13dbm
xn297l_write_buf(W_REGISTER + BB_CAL, BB_cal_data, sizeof(BB_cal_data));
xn297l_write_buf(W_REGISTER + RF_CAL2, RF_cal2_data, sizeof(RF_cal2_data));
xn297l_write_buf(W_REGISTER + DEM_CAL, Dem_cal_data, sizeof(Dem_cal_data));
xn297l_write_buf(W_REGISTER + RF_CAL, RF_cal_data, sizeof(RF_cal_data));
xn297l_write_buf(W_REGISTER + DEM_CAL2, Dem_cal2_data,sizeof(Dem_cal2_data));
}
@@ -0,0 +1,180 @@
/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file drv_xn297l.h
* @brief XN297L RF驱动
*
* @history - V1.0, 2017-03-06, xiaoguolin, first implementation.
*******************************************************************************/
#ifndef __DRV_XN297L_H
#define __DRV_XN297L_H
#ifdef __cplusplus
extern "C"{
#endif
#include "lib_driver_delay_pan159.h"
#include "lib_driver_rfspi_pan159.h"
#define XN297L_RF_DATA_RATE_1M 0x00
#define XN297L_RF_DATA_RATE_2M 0x40
#define XN297L_RF_DATA_RATE_250K 0xC0
#define USER_RF_POWER (CONF_RF_REMOTE_POWER|CONF_RF_REMOTE_RATE)
//#define MONITOR_RF_POWER (CONF_RF_CONGLEX_POWER|CONF_RF_DONGLEX_RATE)
#define TRANS_ENHANCE_MODE 1 //发送增强模式
#define TRANS_NORMAL_MODE 2 //发送普通模式
#define TRANSMIT_TYPE TRANS_NORMAL_MODE //初始设置为普通模式
#define RX_DR_FLAG 0x40 // 接收中断标志位
#define TX_DS_FLAG 0x20 // 发送完成中断标志位
#define RX_TX_FLAG 0x60 // 发送接收完成中断标志位,ack_payload 模式下使用
#define MAX_RT_FLAG 0x10 // 发送重传超时中断标志位
#define XN297L_RF_POWER_P_11 0x27 /** 11dBm */
#define XN297L_RF_POWER_P_10 0x26 /** 10dBm */
#define XN297L_RF_POWER_P_9 0x15 /** 9dBm */
#define XN297L_RF_POWER_P_5 0x2c /** 5dBm */
#define XN297L_RF_POWER_P_4 0x14 /** 4dBm */
#define XN297L_RF_POWER_N_1 0x2A /** -1dBm */
#define XN297L_RF_POWER_N_9 0x29 /** -9dBm */
#define XN297L_RF_POWER_N_10 0x19 /** -10dBm */
#define XN297L_RF_POWER_N_23 0x30 /** -23dBm */
#if( (DATA_RATE ==DR_1M) || (DATA_RATE==DR_2M) )
#define rf7dBm 0X0D // 7dBm 只能用于1M过安规用
#define rf6dBm 0X06 // 6dBm 只能用于1M过安规用
#define rf3dBm 0X0C // 3dBm 只能用于1M过安规用
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//XN297L寄存器操作命令
#define RF_READ_REG 0x00 //读配置寄存器,低5位为寄存器地址
#define RF_WRITE_REG 0x20 //写配置寄存器,低5位为寄存器地址
#define W_REGISTER 0x20 //写配置寄存器,低5位为寄存器地址
#define R_RX_PAYLOAD 0x61 //读RX有效数据, 1~32字节
#define W_TX_PAYLOAD 0xA0 //写TX有效数据,1~32字节
#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL 0xE3 //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP 0xFF //空操作,可以用来读状态寄存器
#define ACTIVATE 0x50 //ACTIVATE
#define DEACTIVATE 0x50 //DEACTIVATE
#define R_RX_PL_WID 0x60 //Read width of RX data
#define W_ACK_PAYLOAD 0xA8 //Data with ACK
#define W_TX_PAYLOAD_NOACK 0xB0 //TX Payload no ACK Request
#define CE_FSPI_ON 0xFD // CE HIGH
#define CE_FSPI_OFF 0xFC // CE LOW
#define RST_FSPI 0x53 // RESET
//SPI(XN297L)寄存器地址
#define CONFIG 0x00 //配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;
//bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能
#define EN_AA 0x01 //使能自动应答功能 bit0~5,对应通道0~5
#define EN_RXADDR 0x02 //接收地址允许,bit0~5,对应通道0~5
#define SETUP_AW 0x03 //设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节;
#define SETUP_RETR 0x04 //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时 250*x+86us
#define RF_CH 0x05 //rf通道,bit6:0,工作通道频率;
#define RF_SETUP 0x06 //rf寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益
#define RF_STATUS 0x07 //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发
//bit5:数据发送完成中断;bit6:接收数据中断;
#define MAX_TX 0x10 //达到最大发送次数中断
#define TX_OK 0x20 //TX发送完成中断
#define RX_OK 0x40 //接收到数据中断
#define OBSERVE_TX 0x08 //传输状态寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器
#define CD 0x09 //载波检测寄存器,bit0,载波检测;
#define RX_ADDR_P0 0x0A //数据通道0接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P1 0x0B //数据通道1接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P2 0x0C //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P3 0x0D //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P4 0x0E //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P5 0x0F //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define TX_ADDR 0x10 //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等
#define RX_PW_P0 0x11 //接收数据通道0有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P1 0x12 //接收数据通道1有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P2 0x13 //接收数据通道2有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P3 0x14 //接收数据通道3有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P4 0x15 //接收数据通道4有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P5 0x16 //接收数据通道5有效数据宽度(1~32字节),设置为0则非法
#define FIFO_STATUS 0x17 //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留
//bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.0,不循环;
#define DEM_CAL 0x19
#define RF_CAL2 0x1A
#define DEM_CAL2 0x1B
#define DYNPD 0x1C
#define FEATURE 0x1D
#define RF_CAL 0x1E
#define BB_CAL 0x1F
#define USER_CHN CONF_RF_REMOTE_CHN //通信信道设置
#define MONITOR_CHN CONF_RF_DONGLEX_CHN //监测通信信道设置
#define PAYLOAD_WIDTH CONF_RF_REMOTE_RX_PAYLOAD_WIDTH //XN297L发送接收数据宽度定义
#define MONITOR_WIDTH CONF_RF_DONGLEX_TX_PAYLOAD_WIDTH
//#define TX_ADR_WIDTH 5 //5字节的地址宽度
//#define RX_ADR_WIDTH 5 //5字节的地址宽度
//#define TX_PLOAD_WIDTH 32 //32字节的用户数据宽度
//#define RX_PLOAD_WIDTH 32 //32字节的用户数据宽度
#define CE_SOFTWARE_MODE 1 //CE软件模式
#define CE_HARDWARE_MODE 2 //CE硬件模式
#define CE_TYPE CE_HARDWARE_MODE //设置为硬件模式
#define IRQ_STATUS rfspi_irq()
#define CSN_HIGH P01=1
#define CSN_LOW P01=0
//#if 0
////PAN163
//#if(CE_TYPE==CE_HARDWARE_MODE)
// #define set_CE() (P02=1)
// #define clear_CE() (P02=0)
//#else
// #define set_CE() (xn297l_write_reg(CE_FSPI_ON, 0))//内部置位CE
// #define clear_CE() (xn297l_write_reg(CE_FSPI_OFF, 0))//内部拉低CE
//#endif
//#endif
////PAN159
//#define set_CE() (xn297l_write_reg(CE_FSPI_ON, 0))//内部置位CE
//#define clear_CE() (xn297l_write_reg(CE_FSPI_OFF, 0))//内部拉低CE
#if(CE_TYPE==CE_HARDWARE_MODE)
#define set_CE() rfspi_ce(1)
#define clear_CE() rfspi_ce(0)
#else
#define set_CE() (xn297l_write_reg(CE_FSPI_ON, 0))//内部置位CE
#define clear_CE() (xn297l_write_reg(CE_FSPI_OFF, 0))//内部拉低CE
#endif
void xn297l_write_reg(uint8_t reg,uint8_t data);//rf写寄存器函数
uint8_t xn297l_read_reg(uint8_t reg);//rf读寄存器函数
void xn297l_write_buf(uint8_t reg,uint8_t *pbuf,uint8_t length);//rf写缓冲函数
void xn297l_read_buf(uint8_t reg,uint8_t *pbuf,uint8_t length);//rf读缓冲函数
//void xn297l_init(void);//rf初始化
void xn297l_init(uint8_t* addr,uint8_t addr_len,uint8_t chn,uint8_t payload,uint8_t rate_power);
void xn297l_tx_mode(void);//XN297L设置为发送模式
void xn297l_rx_mode(void);//XN297L设置为接收模式
uint8_t xn297l_get_status(void);//XN297L获取状态信息
void xn297l_clear_status(void);//XN297L清除状态信息
void xn297l_clear_fifo(void);//XN297L清除缓冲
void xn297l_set_channel(uint8_t channel);//XN297L设置通信信道
void xn297l_tx_data(uint8_t *data, uint8_t length);//XN297L发送数据
uint8_t xn297l_rx_data(uint8_t *data,uint8_t length);//rf接收函数
void xn297l_set_addr(uint8_t reg,uint8_t *rf_addr_array,uint8_t addr_len);//rf设置通信地址
void rf_init(void);
#ifdef __cplusplus
}
#endif
#endif // __DRV_XN297L_H