Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
天中雨水
rt-thread
提交
c121d823
R
rt-thread
项目概览
天中雨水
/
rt-thread
该项目与 Fork 源项目分叉
Fork自
RT-Thread / rt-thread
通知
2
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c121d823
编写于
2月 09, 2018
作者:
南工孙冬梅
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[BSP][ls1c]Fixed some bugs of ls1c lib.
上级
d08ce950
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
68 addition
and
57 deletion
+68
-57
bsp/ls1cdev/libraries/ls1c_pin.c
bsp/ls1cdev/libraries/ls1c_pin.c
+9
-0
bsp/ls1cdev/libraries/ls1c_pin.h
bsp/ls1cdev/libraries/ls1c_pin.h
+1
-0
bsp/ls1cdev/libraries/ls1c_spi.c
bsp/ls1cdev/libraries/ls1c_spi.c
+58
-57
未找到文件。
bsp/ls1cdev/libraries/ls1c_pin.c
浏览文件 @
c121d823
...
...
@@ -42,6 +42,15 @@ void pin_set_remap(unsigned int gpio, pin_remap_t remap)
volatile
unsigned
int
*
reg
=
NULL
;
// 复用寄存器
unsigned
int
port
=
GPIO_GET_PORT
(
gpio
);
unsigned
int
pin
=
GPIO_GET_PIN
(
gpio
);
int
i
;
/*指定全部pin复用为0*/
for
(
i
=
0
;
i
<=
4
;
i
++
)
{
reg
=
(
volatile
unsigned
int
*
)((
LS1C_CBUS_FIRST0
)
+
((
port
)
*
0x04
)
+
((
i
)
*
0x10
));
// 置0
reg_clr_one_bit
(
reg
,
pin
);
}
switch
(
port
)
{
...
...
bsp/ls1cdev/libraries/ls1c_pin.h
浏览文件 @
c121d823
...
...
@@ -20,6 +20,7 @@ typedef enum
PIN_REMAP_THIRD
,
// 第三复用
PIN_REMAP_FOURTH
,
// 第四复用
PIN_REMAP_FIFTH
,
// 第五复用
PIN_REMAP_DEFAULT
,
//缺省复用
}
pin_remap_t
;
...
...
bsp/ls1cdev/libraries/ls1c_spi.c
浏览文件 @
c121d823
...
...
@@ -19,10 +19,10 @@
*
* Change Logs:
* Date Author Notes
* 2017-10-23
勤为本
first version
* 2017-10-23
勤为本
first version
*/
//
硬件spi接口源文件
//
硬件spi接口源文件
#include <string.h>
...
...
@@ -35,8 +35,8 @@
/*
*
获取指定SPI模块的基地址
* @SPIx SPI
模块的编号
*
获取指定SPI模块的基地址
* @SPIx SPI
模块的编号
*/
inline
void
*
ls1c_spi_get_base
(
unsigned
char
SPIx
)
{
...
...
@@ -62,8 +62,8 @@ inline void *ls1c_spi_get_base(unsigned char SPIx)
/*
*
打印指定SPI模块的所有寄存器的值
* @spi_base
基地址
*
打印指定SPI模块的所有寄存器的值
* @spi_base
基地址
*/
void
ls1c_spi_print_all_regs_info
(
void
*
spi_base
)
{
...
...
@@ -81,9 +81,9 @@ void ls1c_spi_print_all_regs_info(void *spi_base)
/*
*
根据SPI时钟频率计算分频系数
* @max_speed_hz SPI
最大通信速度
* @ret
分频系数
*
根据SPI时钟频率计算分频系数
* @max_speed_hz SPI
最大通信速度
* @ret
分频系数
*/
unsigned
int
ls1c_spi_get_div
(
unsigned
int
max_speed_hz
)
{
...
...
@@ -145,28 +145,28 @@ unsigned int ls1c_spi_get_div(unsigned int max_speed_hz)
/*
*
设置时钟
* @spi_base
基地址
* @max_hz
最大频率,单位
hz
*
设置时钟
* @spi_base
基地址
* @max_hz
最大频率,单位hz
*/
void
ls1c_spi_set_clock
(
void
*
spi_base
,
unsigned
long
max_hz
)
{
unsigned
int
div
=
0
;
unsigned
char
val
=
0
;
//
获取分频系数
//
获取分频系数
div
=
ls1c_spi_get_div
(
max_hz
);
//
设置
spr
//
设置s
pr
val
=
reg_read_8
(
spi_base
+
LS1C_SPI_SPCR_OFFSET
);
val
&=
(
~
LS1C_SPI_SPCR_SPR_MASK
);
// spr
清零
val
|=
(
div
&
LS1C_SPI_SPCR_SPR_MASK
);
//
设置新的
spr
val
&=
(
~
LS1C_SPI_SPCR_SPR_MASK
);
// spr
清零
val
|=
(
div
&
LS1C_SPI_SPCR_SPR_MASK
);
//
设置新的sp
r
reg_write_8
(
val
,
spi_base
+
LS1C_SPI_SPCR_OFFSET
);
//
设置
spre
//
设置s
pre
val
=
reg_read_8
(
spi_base
+
LS1C_SPI_SPER_OFFSET
);
val
&=
(
~
LS1C_SPI_SPER_SPRE_MASK
);
// spre
清零
val
|=
((
div
>>
2
)
&
LS1C_SPI_SPER_SPRE_MASK
);
//
设置新的
spre
val
&=
(
~
LS1C_SPI_SPER_SPRE_MASK
);
// spre
清零
val
|=
((
div
>>
2
)
&
LS1C_SPI_SPER_SPRE_MASK
);
//
设置新的sp
re
reg_write_8
(
val
,
spi_base
+
LS1C_SPI_SPER_OFFSET
);
return
;
...
...
@@ -174,10 +174,10 @@ void ls1c_spi_set_clock(void *spi_base, unsigned long max_hz)
/*
*
设置通信模式(时钟极性和相位
)
* @spi_base
基地址
* @cpol
时钟极性
* @cpha
时钟相位
*
设置通信模式(时钟极性和相位)
* @spi_base
基地址
* @cpol
时钟极性
* @cpha
时钟相位
*/
void
ls1c_spi_set_mode
(
void
*
spi_base
,
unsigned
char
cpol
,
unsigned
char
cpha
)
{
...
...
@@ -185,13 +185,13 @@ void ls1c_spi_set_mode(void *spi_base, unsigned char cpol, unsigned char cpha)
val
=
reg_read_8
(
spi_base
+
LS1C_SPI_SPCR_OFFSET
);
//
设置时钟极性
--cpol
val
&=
(
~
LS1C_SPI_SPCR_CPOL_MASK
);
// cpol
清0
val
|=
(
cpol
<<
LS1C_SPI_SPCR_CPOL_BIT
);
//
写入新的
cpol
//
设置时钟极性--
cpol
val
&=
(
~
LS1C_SPI_SPCR_CPOL_MASK
);
// cpol
清
0
val
|=
(
cpol
<<
LS1C_SPI_SPCR_CPOL_BIT
);
//
写入新的cp
ol
//
设置时钟相位
--cpha
val
&=
(
~
LS1C_SPI_SPCR_CPHA_MASK
);
// cpha
清0
val
|=
(
cpha
<<
LS1C_SPI_SPCR_CPHA_BIT
);
//
写入新的
cpha
//
设置时钟相位--c
pha
val
&=
(
~
LS1C_SPI_SPCR_CPHA_MASK
);
// cpha
清
0
val
|=
(
cpha
<<
LS1C_SPI_SPCR_CPHA_BIT
);
//
写入新的cp
ha
reg_write_8
(
val
,
spi_base
+
LS1C_SPI_SPCR_OFFSET
);
...
...
@@ -200,23 +200,24 @@ void ls1c_spi_set_mode(void *spi_base, unsigned char cpol, unsigned char cpha)
/*
*
设置指定片选为指定状态
* @spi_base
基地址
* @cs
片选
* @new_status
片选引脚的新状态,取值为0或1,即高电平或低电平
*
设置指定片选为指定状态
* @spi_base
基地址
* @cs
片选
* @new_status
片选引脚的新状态,取值为0或1,即高电平或低电平
*/
void
ls1c_spi_set_cs
(
void
*
spi_base
,
unsigned
char
cs
,
int
new_status
)
{
unsigned
char
val
=
0
;
val
=
0xf0
|
(
0x01
<<
cs
);
// 全部csn=1,指定的csen=1
val
=
reg_read_8
(
spi_base
+
LS1C_SPI_SFC_SOFTCS_OFFSET
);
val
|=
0x01
<<
cs
;
//对应的csen=1
if
(
new_status
)
// cs = 1
{
val
|=
(
0x10
<<
cs
);
//
指定
csn=1
val
|=
(
0x10
<<
cs
);
//
指定c
sn=1
}
else
// cs = 0
{
val
&=
~
(
0x10
<<
cs
);
//
指定
csn=0
val
&=
~
(
0x10
<<
cs
);
//
指定c
sn=0
}
reg_write_8
(
val
,
spi_base
+
LS1C_SPI_SFC_SOFTCS_OFFSET
);
...
...
@@ -225,8 +226,8 @@ void ls1c_spi_set_cs(void *spi_base, unsigned char cs, int new_status)
/*
*
等待收发完成
* @spi_base
基地址
*
等待收发完成
* @spi_base
基地址
*/
inline
void
ls1c_spi_wait_txrx_done
(
void
*
spi_base
)
{
...
...
@@ -243,25 +244,25 @@ inline void ls1c_spi_wait_txrx_done(void *spi_base)
/*
*
清中断和标志位
* @spi_base
基地址
*
清中断和标志位
* @spi_base
基地址
*/
inline
void
ls1c_spi_clear
(
void
*
spi_base
)
{
unsigned
char
val
=
0
;
//
清中断
//
清中断
val
=
reg_read_8
(
spi_base
+
LS1C_SPI_SPSR_OFFSET
);
val
|=
LS1C_SPI_SPSR_SPIF_MASK
;
reg_write_8
(
val
,
spi_base
+
LS1C_SPI_SPSR_OFFSET
);
//
清溢出标志位
(Write-Collision Clear)
//
清溢出标志位(Wr
ite-Collision Clear)
val
=
reg_read_8
(
spi_base
+
LS1C_SPI_SPSR_OFFSET
);
if
(
LS1C_SPI_SPSR_WCOL_MASK
&
val
)
{
rt_kprintf
(
"[%s] clear register SPSR's wcol!
\r\n
"
);
//
手册和linux源码中不一样,加个打印看看
reg_write_8
(
val
&
~
LS1C_SPI_SPSR_WCOL_MASK
,
spi_base
+
LS1C_SPI_SPSR_OFFSET
);
//
写0,linux源码中是写0
// reg_write_8(val | LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); //
写1,按照1c手册,应该写
1
rt_kprintf
(
"[%s] clear register SPSR's wcol!
\r\n
"
);
//
手册和linux源码中不一样,加个打印看看
reg_write_8
(
val
&
~
LS1C_SPI_SPSR_WCOL_MASK
,
spi_base
+
LS1C_SPI_SPSR_OFFSET
);
//
写0,linux源码中是写0
// reg_write_8(val | LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); //
写1,按照1c手册,应该写1
}
return
;
...
...
@@ -270,23 +271,23 @@ inline void ls1c_spi_clear(void *spi_base)
/*
*
通过指定SPI发送接收一个字节
*
注意,在多任务的系统中,此函数需要互斥。
*
即保证在和某个从设备收发某个字节的过程中,不能被切换到其它任务同时与另外的在同一个SPI总线上的从设备通信
*
因为龙芯1c的每路SPI上可能接有不同的从设备,通信频率、模式等可能不同
* @spi_base
基地址
* @tx_ch
待发送的数据
* @ret
收到的数据
*
通过指定SPI发送接收一个字节
*
注意,在多任务的系统中,此函数需要互斥。
*
即保证在和某个从设备收发某个字节的过程中,不能被切换到其它任务同时与另外的在同一个SPI总线上的从设备通信
*
因为龙芯1c的每路SPI上可能接有不同的从设备,通信频率、模式等可能不同
* @spi_base
基地址
* @tx_ch
待发送的数据
* @ret
收到的数据
*/
unsigned
char
ls1c_spi_txrx_byte
(
void
*
spi_base
,
unsigned
char
tx_ch
)
{
unsigned
char
rx_ch
=
0
;
//
收发数据
reg_write_8
(
tx_ch
,
spi_base
+
LS1C_SPI_TxFIFO_OFFSET
);
//
开始发送
ls1c_spi_wait_txrx_done
(
spi_base
);
//
等待收发完成
rx_ch
=
reg_read_8
(
spi_base
+
LS1C_SPI_RxFIFO_OFFSET
);
//
读取收到的数据
ls1c_spi_clear
(
spi_base
);
//
清中断和标志位
//
收发数据
reg_write_8
(
tx_ch
,
spi_base
+
LS1C_SPI_TxFIFO_OFFSET
);
//
开始发送
ls1c_spi_wait_txrx_done
(
spi_base
);
//
等待收发完成
rx_ch
=
reg_read_8
(
spi_base
+
LS1C_SPI_RxFIFO_OFFSET
);
//
读取收到的数据
ls1c_spi_clear
(
spi_base
);
//
清中断和标志位
return
rx_ch
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录