程序:
rem Main.bas file generated by New Project wizard
rem
rem Created: 周日 10月 5 2025
rem Processor: ATmega16
rem Compiler: BASCOM-AVR
rem 23LC1024 SRAM 综合测试(BASCOM-AVR版)
$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 64
' 引脚定义
'如果不配置Noss = 1就不能使用硬件spi的ss管脚Portb.2!!!!这时须选择其他端口管脚单独配置如PortD.2。
'或者加实物上拉电阻可取消Portb.2 = 1
'Config PinD.2 = Output
'PortD.2 = 1
Cs Alias Portb.4
' SPI 配置
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1
Spiinit
' 变量定义
Dim Write_byte As Byte , Read_byte As Byte
Dim Temp As Byte
Dim i As Byte , j As Byte
Dim Test_data As Byte
Dim Addr As Long
Dim Error_count As Word
Dim Addr_high As Byte
Dim Addr_mid As Byte
Dim Addr_low As Byte
Dim Pass_count As Word
' 串口配置
'Config Com1 = 9600 , Parity = None , Stopbits = 1 , Databits = 8
$baud = 9600
' 声明子程序
Declare Sub Spi_write()
Declare Sub Spi_read()
Declare Sub Test_single_address()
Declare Sub Test_multiple_addresses()
Declare Sub Test_sequential_addresses()
Declare Sub Test_boundary_addresses()
Declare Sub Test_data_patterns()
' 主程序
Print
Print " ========================================"
Print " 23LC1024 SRAM 综合测试"
Print " ========================================"
Print
Waitms 1000
' 运行各种测试
Call Test_single_address
Call Test_multiple_addresses
Call Test_sequential_addresses
Call Test_boundary_addresses
Call Test_data_patterns
Print
Print " ========================================"
Print " 所有测试已完成!"
Print " ========================================"
Do
' 主循环
Loop
End
' SPIWrite子程序
Sub Spi_write()
Addr_high = Addr / 65536
Addr_mid = Addr / 256
Addr_low = Addr And &HFF
Reset Cs
Temp = &H02 : Spiout Temp , 1 ' WRITE命令
Spiout Addr_high , 1 ' 地址高字节
Spiout Addr_mid , 1 ' 地址中字节
Spiout Addr_low , 1 ' 地址低字节
Spiout Write_byte , 1 ' 数据
Set Cs
Waitms 5 ' Write周期等待
End Sub
' SPI读子程序
Sub Spi_read()
Addr_high = Addr / 65536
Addr_mid = Addr / 256
Addr_low = Addr And &HFF
Reset Cs
Temp = &H03 : Spiout Temp , 1 ' READ命令
Spiout Addr_high , 1 ' 地址高字节
Spiout Addr_mid , 1 ' 地址中字节
Spiout Addr_low , 1 ' 地址低字节
Spiin Read_byte , 1 ' 读取数据
Set Cs
End Sub
' 测试1: 单地址基本功能
Sub Test_single_address()
Print " 测试 1:单地址基本功能"
Print " ----------------------------------------"
Addr = &H1234
Write_byte = &HA5
Call Spi_write
Call Spi_read
Print " Address: 0x" ; Hex(addr) ; " Write: 0x" ; Hex(write_byte) ; " Read: 0x" ; Hex(read_byte)
If Write_byte = Read_byte Then
Print " >>> 单地址测试:通过"
Else
Print " >>> 单一地址测试:失败"
End If
Print
End Sub
' 测试2: 多地址测试
Sub Test_multiple_addresses()
Print " 测试 2:多地址测试"
Print "----------------------------------------"
Error_count = 0
For i = 1 To 10
Addr = i * &H1000 ' 递增地址
Write_byte = i * &H11 ' 递增数据
Call Spi_write
Call Spi_read
Print " Addr: 0x" ; Hex(addr) ; " Write: 0x" ; Hex(write_byte) ; " Read: 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then
Incr Error_count
Print " *** 地址 0x 处出错" ; Hex(addr)
End If
Next i
Pass_count = 10 - Error_count
Print " 多个地址测试: " ;Pass_count ;"/10 通过"
Print
End Sub
' 测试3: 连续地址测试
Sub Test_sequential_addresses()
Print " 测试 3:连续地址测试"
Print " ----------------------------------------"
Error_count = 0
Addr = &H5000
For i = 0 To 15
Write_byte = &H40 + i ' 连续数据
Call Spi_write
Call Spi_read
If Write_byte <> Read_byte Then
Incr Error_count
Print " *** 在顺序地址处出现错误 " ; i
End If
Addr = Addr + 1
Print " Addr: 0x" ; Hex(addr) ;"Write 0x" ; Hex(write_byte);" Read 0x" ;Hex(read_byte)
Next i
Pass_count = 16 - Error_count
Print" 连续地址测试: " ;Pass_count ;"/16 通过"
Print
End Sub
' 测试4: 边界地址测试
Sub Test_boundary_addresses()
Print " 测试 4:边界地址测试"
Print " ----------------------------------------"
Error_count = 0
' 测试边界地址
Write_byte = &H5A
' 最低地址
Addr = &H00000
Call Spi_write
Call Spi_read
Print " 边界 0x" ; Hex(addr) ; " : Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
' 第一页结束
Addr = &H000FF
Call Spi_write
Call Spi_read
Print " 边界 0x" ; Hex(addr) ; " : Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
' 最后页开始
Addr = &H1FF00
Call Spi_write
Call Spi_read
Print " 边界 0x" ; Hex(addr) ; " : Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
' 最高地址 (128KB)
Addr = &H1FFFF
Call Spi_write
Call Spi_read
Print " 边界 0x" ; Hex(addr) ; " : Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
Pass_count = 4 - Error_count
Print " 边界地址测试: " ;Pass_count ;"/4 通过"
Print
End Sub
' 测试5: 数据模式测试
Sub Test_data_patterns()
Print " 测试 5:数据模式测试"
Print "----------------------------------------"
Error_count = 0
Addr = &H8000
' 测试各种数据模式
Write_byte = &H00 ' 全0
Call Spi_write : Call Spi_read
Print " 模式 1:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
Addr = Addr + 1
Write_byte = &HFF ' 全1
Call Spi_write : Call Spi_read
Print " 模式 2:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
Addr = Addr + 1
Write_byte = &H55 ' 01010101
Call Spi_write : Call Spi_read
Print " 模式 3:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
Addr = Addr + 1
Write_byte = &HAA ' 10101010
Call Spi_write : Call Spi_read
Print " 模式 4:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
Addr = Addr + 1
Write_byte = &H0F ' 00001111
Call Spi_write : Call Spi_read
Print " 模式 5:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
Addr = Addr + 1
Write_byte = &HF0 ' 11110000
Call Spi_write : Call Spi_read
Print " 模式 6:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
Addr = Addr + 1
Write_byte = &H33 ' 00110011
Call Spi_write : Call Spi_read
Print " 模式 7:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
Addr = Addr + 1
Write_byte = &HCC ' 11001100
Call Spi_write : Call Spi_read
Print " 模式 8:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
If Write_byte <> Read_byte Then Incr Error_count
Pass_count = 8 - Error_count
Print " 数据模式测试: " ;Pass_count ;"/8 通过"
Print
End Sub
|