#include "includes.h"
#include "drv_xr20m1170.h"
#include "drv_spi.h"
XR20M1170_Handle_t xr20m1170_handle = {
.baud_rate = 115200, //波特率
8, //数据位数,可选5、6、7、8位
0, //校验位, 0 -> 无校验,1 -> 奇校验,2 -> 偶校验
0, //停止位,0 -> 1位,1(5bit) -> 1~1.5位、1(6、7、8bit) -> 2位
16, //采样率,可选16倍采样率、8倍采样率、4倍采样率
TRUE, //FIFO使能
FALSE, //硬件流控
FALSE, //软件流控
FALSE, //RTS halt
FALSE, //CTS流控
FALSE, //RS485自动控制
FALSE, //红外模式
FALSE, //内部回环
0, //TX FIFO触发等级
0, //RX FIFO触发等级
};
void drv_xr20m1170_reset(void)
{
gpio_set(SPI_UART_RST_GPIO, GPIO_PIN_RESET);
HAL_Delay(100);
gpio_set(SPI_UART_RST_GPIO, GPIO_PIN_SET);
HAL_Delay(100);
}
/*****************************XR20M1170写一个寄存器值***********************************/
RET_CODE drv_xr20m1170_write_reg(uint8 reg_addr, uint8 value)
{
RET_CODE ret = RET_FAIL;
uint8 inner_reg = 0x00;
if(EFCR < reg_addr)
return ret;
//spi_uart_mutex_lock();
BSP_SPI_UART_CS_LOW();
inner_reg = reg_addr << REG_ADDR_POS;
inner_reg &= REG_ADDR_MASK;
inner_reg &= ~SPI_READ_WRITE;
//syslog(DBG_LEVL_INFO, "Write inner_reg[0x%02X]", inner_reg);
#if 0
spi_write_read_byte(BSP_SPI_XR20M1170, inner_reg); //先写地址
spi_write_read_byte(BSP_SPI_XR20M1170, value); //再写数据
#else
SPI_Send_Dat(inner_reg);
SPI_Send_Dat(value);
#endif
BSP_SPI_UART_CS_HIGH();
//spi_uart_mutex_unlock();
ret = RET_SUCCESS;
return ret;
}
/*****************************XR20M1170读一个寄存器值***********************************/
uint8 drv_xr20m1170_read_reg(uint8 reg_addr)
{
uint8 value = 0x00;
uint8 inner_reg = 0x00;
if(EFCR < reg_addr)
return value;
//spi_uart_mutex_lock();
BSP_SPI_UART_CS_LOW();
inner_reg = reg_addr << REG_ADDR_POS;
inner_reg &= REG_ADDR_MASK;
inner_reg |= SPI_READ_WRITE;
//syslog(DBG_LEVL_INFO, "Read inner_reg[0x%02X]", inner_reg);
#if 0
spi_write_read_byte(BSP_SPI_XR20M1170, inner_reg);
value =spi_write_read_byte(BSP_SPI_FALSH, 0xFF);
#else
SPI_Send_Dat(inner_reg);
value =SPI_Receiver_Dat();
#endif
BSP_SPI_UART_CS_HIGH();
//spi_uart_mutex_unlock();
return value;
}
/************************************XR20M1170写FIFO***********************************/
RET_CODE drv_xr20m1170_fifo_write(uint8 *data, uint16 len)
{
RET_CODE ret = RET_FAIL;
uint8 inner_reg = 0x00;
uint8 reg_addr = THR;
uint16 i = 0;
if((NULL == data)||(0 == len))
return ret;
BSP_SPI_UART_CS_LOW();
inner_reg = reg_addr << REG_ADDR_POS;
inner_reg &= REG_ADDR_MASK;
inner_reg &= ~SPI_READ_WRITE;
spi_write_read_byte(BSP_SPI_XR20M1170, inner_reg); //先写地址
for(i=0; i<len; i++)
{
//需先判断发送FIFO状态,然后在发送
spi_write_read_byte(BSP_SPI_XR20M1170, data[i]); //再写数据
}
BSP_SPI_UART_CS_HIGH();
ret = RET_SUCCESS;
return ret;
}
/************************************XR20M1170读FIFO***********************************/
uint16 drv_xr20m1170_fifo_read(uint8 *data, uint16 len)
{
uint16 i;
uint8 inner_reg = 0x00;
uint8 reg_addr = RHR;
if((NULL == data)||(0 == len))
return i;
BSP_SPI_UART_CS_LOW();
inner_reg = reg_addr << REG_ADDR_POS;
inner_reg &= REG_ADDR_MASK;
inner_reg |= SPI_READ_WRITE;
spi_write_read_byte(BSP_SPI_XR20M1170, inner_reg);
for(i=0; i<len; i++)
{
//需要注意FIFO为空的情况
data[i] =spi_write_read_byte(BSP_SPI_FALSH, 0xFF);
}
BSP_SPI_UART_CS_HIGH();
return i;
}
/************************************XR20M1170设置波特率***********************************/
RET_CODE drv_xr20m1170_set_baud_rate(XR20M1170_Handle_t *xr20_handle)
{
RET_CODE ret = RET_FAIL;
float divisor = 0.0;
uint32 divisor_int = 0;
float divisor_frac = 0;
uint32 baud_rate = 0;
uint8 sample_rate = 0;
uint8 prescaler = 1;
uint8 dlm_value = 0;
uint8 dll_value = 0;
uint8 dld_value = 0;
uint8 lcr_value = 0;
if(NULL == xr20_handle)
return ret;
sample_rate =0;
switch(xr20_handle->sampling_rate)
{
case 16:
sample_rate =0;
break;
case 8:
sample_rate =1;
break;
case 4:
sample_rate =2;
break;
default:
sample_rate =0;
break;
}
/*Required Divisor (decimal)=(XTAL1 clock frequency / prescaler) /(serial data rate x 16), with 16X mode*/
baud_rate = xr20_handle->baud_rate;
if( 0 == baud_rate)
baud_rate = 115200;
divisor = (XTAL1_FREQ / prescaler) / (baud_rate * xr20_handle->sampling_rate);
divisor_int = (uint32)divisor/1*1;
divisor_frac = (divisor - divisor_int) * 16;
if(((uint32)(divisor_frac * 10) % 10) >= 5)
divisor_frac += 1;
dlm_value = divisor_int >> 8;
dll_value = divisor_int & 0xFF;
dld_value = (uint8)divisor_frac;
dld_value &= ~DLD_SAMP_RATE_MASK;
dld_value |= sample_rate << DLD_SAMP_RATE_POS;
syslog(DBG_LEVL_INFO,"baud_rate = %d, dlm_value[0x%x], dll_value[0x%x], dld_value[0x%x]", baud_rate, dlm_value, dll_value, dld_value);
//设置波特率
ret = drv_xr20m1170_write_reg (EFR, 0x10); // enable shaded bits and access to DLD
lcr_value = drv_xr20m1170_read_reg(LCR);
lcr_value |= 1<<LCR_B_R_D_EN_POS;
ret &= drv_xr20m1170_write_reg(LCR, lcr_value); //enable access to divisors
ret &= drv_xr20m1170_write_reg(DLM, dlm_value);
ret &= drv_xr20m1170_write_reg(DLL, dll_value);
ret &= drv_xr20m1170_write_reg(DLD, dld_value);
lcr_value &= ~LCR_B_R_D_EN_MASK;
ret &= drv_xr20m1170_write_reg(LCR, lcr_value);
ret = drv_xr20m1170_write_reg (EFR, 0x00); // disable shaded bits
return ret;
}
/************************************XR20M1170设置数据位***********************************/
RET_CODE drv_xr20m1170_set_data_bit(XR20M1170_Handle_t *xr20_handle)
{
RET_CODE ret = RET_FAIL;
uint8 data_bit = 0;
uint8 lcr_value = 0;
if(NULL == xr20_handle)
return ret;
lcr_value = drv_xr20m1170_read_reg(LCR);
//设置位数
switch(xr20_handle->data_bit_num)
{
case 5:
data_bit = 0;
break;
case 6:
data_bit = 1;
break;
case 7:
data_bit = 2;
break;
case 8:
data_bit = 3;
break;
default:
data_bit = 3;
break;
}
lcr_value &= ~LCR_WORD_LEN_MASK;
lcr_value |=data_bit << LCR_WORD_LEN_POS;
ret &= drv_xr20m1170_write_reg(LCR, lcr_value); //8N1 data format
return ret;
}
/************************************XR20M1170设置停止位***********************************/
RET_CODE drv_xr20m1170_set_stop_bit(XR20M1170_Handle_t *xr20_handle)
{
RET_CODE ret = RET_FAIL;
uint8 stop_bit = 0;
uint8 lcr_value = 0;
if(NULL == xr20_handle)
return ret;
lcr_value = drv_xr20m1170_read_reg(LCR);
//停止位
stop_bit = xr20_handle->stop_bit;
lcr_value &= ~LCR_STOP_BIT_MSAS;
lcr_value |=stop_bit << LCR_STOP_BIT_POS;
ret &= drv_xr20m1170_write_reg(LCR, lcr_value); //8N1 data format
return ret;
}
/************************************XR20M1170设置校验位***********************************/
RET_CODE drv_xr20m1170_set_parity_bit(XR20M1170_Handle_t *xr20_handle)
{
RET_CODE ret = RET_FAIL;
uint8 parity_bit = 0;
uint8 parity_sel = 0;
uint8 lcr_value = 0;
if(NULL == xr20_handle)
return ret;
lcr_value = drv_xr20m1170_read_reg(LCR);
//校验位
switch (xr20_handle->parity_bit)
{
case 0: //无校验
parity_bit = 0;
parity_sel = 0;
break;
case 1: //奇校验
parity_bit = 1;
parity_sel = 0;
break;
case 2: //偶校验
parity_bit = 1;
parity_sel = 1;
break;
default:
parity_bit = 0;
parity_sel = 0;
break;
}
lcr_value &= ~LCR_PARITY_EN_MASK;
lcr_value |=parity_bit << LCR_PARITY_EN_POS;
lcr_value &= ~LCR_PARITY_SEL_MASK;
lcr_value |=parity_sel << LCR_PARITY_SEL_POS;
ret &= drv_xr20m1170_write_reg(LCR, lcr_value); //8N1 data format
return ret;
}
/******
没有合适的资源?快使用搜索试试~ 我知道了~
SPI_2ic转串口芯片XR20M1170驱动程序(c源码),包括底层驱动+API接口层.zip
共4个文件
c:2个
h:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 50 浏览量
2022-03-13
07:20:17
上传
评论
收藏 8KB ZIP 举报
温馨提示
SPI_2ic转串口芯片XR20M1170驱动程序(c源码),包括底层驱动+API接口层
资源推荐
资源详情
资源评论
收起资源包目录
SPI_2ic转串口芯片XR20M1170驱动程序(c源码),包括底层驱动+API接口层.zip (4个子文件)
xr20m1170
drv_xr20m1170.h 6KB
api_xr20m1170.h 1KB
api_xr20m1170.c 8KB
drv_xr20m1170.c 16KB
共 4 条
- 1
资源评论
- 乐天要努力2024-01-24总算找到了自己想要的资源,对自己的启发很大,感谢分享~
SKCQTGZX
- 粉丝: 86
- 资源: 5820
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功